八皇后问题是一道经典的回溯算法问题,其解决思路大致如下:

  1. 从第一行开始,依次放置 8 个皇后;
  2. 对于每一个皇后,判断其是否与之前放置的皇后冲突;
  3. 如果当前皇后与之前的皇后冲突,则回溯到上一个皇后位置,重新放置皇后;
  4. 如果所有皇后均放置成功,则输出结果。

下面是 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种解法

可以看到,代码成功地输出了八皇后问题的所有解法。

Java 实现八皇后问题:算法详解及代码示例

原文地址: https://www.cveoy.top/t/topic/mVO9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录