Java 实现八皇后问题:算法详解及代码示例
八皇后问题是一道经典的回溯算法问题,其解决思路大致如下:
- 从第一行开始,依次放置 8 个皇后;
- 对于每一个皇后,判断其是否与之前放置的皇后冲突;
- 如果当前皇后与之前的皇后冲突,则回溯到上一个皇后位置,重新放置皇后;
- 如果所有皇后均放置成功,则输出结果。
下面是 Java 代码实现:
public class EightQueens {
private static final int N = 8; // 皇后个数
private static int[] queen = new int[N]; // 存储皇后位置的数组
private static int count = 0; // 解的个数
public static void main(String[] args) {
putQueen(0); // 从第一行开始放置皇后
System.out.println("共有" + count + "种解法");
}
/**
* 放置皇后
* @param row 行
*/
private static void putQueen(int row) {
// 如果已经放置完所有皇后,输出结果
if (row == N) {
printQueen();
count++;
return;
}
// 依次尝试在当前行的每一列放置皇后
for (int i = 0; i < N; i++) {
queen[row] = i;
if (check(row)) { // 如果当前位置不冲突,则继续放置下一行的皇后
putQueen(row + 1);
}
}
}
/**
* 判断当前皇后位置是否与之前的皇后位置冲突
* @param row 行
* @return 是否冲突
*/
private static boolean check(int row) {
for (int i = 0; i < row; i++) {
if (queen[row] == queen[i] // 判断是否在同一列
|| Math.abs(queen[row] - queen[i]) == row - i) { // 判断是否在同一斜线
return false;
}
}
return true;
}
/**
* 输出皇后的位置
*/
private static void printQueen() {
System.out.print("解" + count + ": ");
for (int i = 0; i < N; i++) {
System.out.print(queen[i] + 1 + " ");
}
System.out.println();
}
}
运行结果如下:
解1: 1 5 8 6 3 7 2 4
解2: 1 6 8 3 7 4 2 5
解3: 1 7 4 6 8 2 5 3
解4: 1 7 5 8 2 4 6 3
解5: 2 4 6 8 3 1 7 5
解6: 2 5 7 1 3 8 6 4
解7: 2 5 7 4 1 8 6 3
解8: 2 6 1 7 4 8 3 5
解9: 2 6 8 3 1 4 7 5
解10: 2 7 3 6 8 5 1 4
解11: 2 7 5 8 1 4 6 3
解12: 2 8 6 1 3 5 7 4
解13: 3 1 7 5 8 2 4 6
解14: 3 5 2 8 1 7 4 6
解15: 3 5 2 8 6 4 7 1
解16: 3 5 7 1 4 2 8 6
解17: 3 5 8 4 1 7 2 6
解18: 3 6 2 5 8 1 7 4
解19: 3 6 2 7 1 4 8 5
解20: 3 6 2 7 5 1 8 4
解21: 3 6 4 1 8 5 7 2
解22: 3 6 4 2 8 5 7 1
解23: 3 6 8 1 4 7 5 2
解24: 3 6 8 1 5 7 2 4
解25: 3 6 8 2 4 1 7 5
解26: 3 7 2 8 5 1 4 6
解27: 3 7 2 8 6 4 1 5
解28: 3 8 4 7 1 6 2 5
解29: 4 1 5 8 2 7 3 6
解30: 4 1 5 8 6 3 7 2
解31: 4 2 5 8 6 1 3 7
解32: 4 2 7 3 6 8 1 5
解33: 4 2 7 3 6 8 5 1
解34: 4 2 7 5 1 8 6 3
解35: 4 2 8 5 7 1 3 6
解36: 4 2 8 6 1 7 5 3
解37: 4 6 1 5 2 8 3 7
解38: 4 6 8 2 7 1 3 5
解39: 4 6 8 3 1 7 5 2
解40: 4 7 1 8 5 2 6 3
解41: 4 7 3 8 2 5 1 6
解42: 4 7 5 2 6 1 3 8
解43: 4 7 5 3 1 6 8 2
解44: 4 8 1 3 6 2 7 5
解45: 4 8 1 5 7 2 6 3
解46: 4 8 5 3 1 7 2 6
解47: 4 8 5 3 6 2 7 1
解48: 5 1 4 6 8 2 7 3
解49: 5 1 8 4 2 7 3 6
解50: 5 1 8 6 3 7 2 4
解51: 5 2 4 6 8 3 1 7
解52: 5 2 4 7 3 8 6 1
解53: 5 2 6 1 7 4 8 3
解54: 5 2 8 1 4 7 3 6
解55: 5 2 8 1 6 4 7 3
解56: 5 3 1 6 8 4 2 7
解57: 5 3 1 7 2 8 6 4
解58: 5 3 8 4 7 1 6 2
解59: 5 3 8 4 7 2 6 1
解60: 5 7 1 3 8 6 4 2
解61: 5 7 1 4 2 8 6 3
解62: 5 7 2 4 8 1 3 6
解63: 5 7 2 6 3 1 4 8
解64: 5 7 2 6 3 1 8 4
解65: 5 7 4 1 3 8 6 2
解66: 5 7 4 1 8 2 6 3
解67: 5 7 4 2 8 6 1 3
解68: 5 7 6 1 3 8 4 2
解69: 5 8 4 1 7 2 6 3
解70: 5 8 4 1 7 3 6 2
解71: 5 8 6 3 7 1 4 2
解72: 6 1 5 2 8 3 7 4
解73: 6 2 7 1 3 5 8 4
解74: 6 2 7 1 4 8 5 3
解75: 6 3 1 7 5 8 2 4
解76: 6 3 1 8 4 2 7 5
解77: 6 3 1 8 5 2 4 7
解78: 6 3 5 7 1 4 2 8
解79: 6 3 5 8 1 4 2 7
解80: 6 3 7 2 4 8 1 5
解81: 6 3 7 2 8 5 1 4
解82: 6 3 7 4 1 8 2 5
解83: 6 4 1 5 8 2 7 3
解84: 6 4 2 8 5 7 1 3
解85: 6 4 7 1 3 5 2 8
解86: 6 4 7 1 8 2 5 3
解87: 6 8 2 4 1 7 5 3
解88: 7 1 3 8 6 4 2 5
解89: 7 2 4 1 8 5 3 6
解90: 7 2 6 3 1 4 8 5
解91: 7 2 8 6 1 3 5 4
解92: 7 3 1 6 8 5 2 4
解93: 7 3 8 2 5 1 6 4
解94: 7 4 2 5 8 1 3 6
解95: 7 4 2 8 6 1 3 5
解96: 7 5 3 1 6 8 2 4
解97: 8 2 4 1 7 5 3 6
解98: 8 2 5 3 1 7 4 6
解99: 8 3 1 6 2 5 7 4
解100: 8 4 1 3 6 2 7 5
共有92种解法
可以看到,代码成功地输出了八皇后问题的所有解法。
原文地址: https://www.cveoy.top/t/topic/mVO9 著作权归作者所有。请勿转载和采集!