您的当前位置:首页正文

八皇后问题(递归实现)

2024-11-09 来源:个人技术集锦

问题描述:在一个8*8的二维数组中,每一行只能放一个皇后,而且与其他皇后不可以在同一行、同一列和同一条斜线上。

代码实现:

//8皇后问题
public class Queen8 {

    //表示皇后个数
    private static int max = 8;

    //用一维数组表示棋盘
    //例:arr[i] = 5 ——> i表示第i + 1行(第i + 1个皇后),5表示第5 + 1列,来表示该皇后的位置
    private static int[] arr = new int[max];

    //表示第几种结果
    private static int count = 0;

    public static void main(String[] args) {
        setQueen(0);
    }

    //向数组中放第n个皇后
    public static void setQueen(int n) {
        if (n == max) { //n == max表示所有的皇后都已经放入
            //打印这种结果
            print();
            return;
        }
        //将当前皇后在这一行中的每个位置存放,查看是否合理
        for (int i = 0; i < max; i++) {
            //第n个皇后,放置在第n行的第i列
            arr[n] = i;
            //判断是否合理
            if (checkConflict(n)) {
                //合理,开始放置下一个皇后
                setQueen(n + 1);
            }
            //不合理,就放入下一列
        }
    }


    /**
     * 检测第n个皇后与之前摆放的皇后是否冲突
     * @param n n表示第n个皇后,皇后从0开始
     * @return true表示不冲突,false表示冲突
     */
    public static boolean checkConflict(int n) {
        //循环遍历n之前的皇后
        for (int i = 0; i < n; i++) {
            //1.如果在同一列,则冲突——> arr[i] = arr[n]
            //2.如果在同一斜线,则冲突——> Math.abs(arr[i] - arr[n]) == Math.abs(i - n)
                //Math.abs表示获取绝对值
                //二维数组中,如果两个点行坐标的差和列坐标的差相等,则表示在统一条斜线上
                //i - n表示行的差,arr[i] - arr[n]表示列的差
            //3.如果在同一行,则冲突——> 因为第n个皇后就在第n行所以不会出现在同一行的问题
            if (arr[i] == arr[n] || Math.abs(arr[i] - arr[n]) == Math.abs(i - n)) {
                return false;
            }
        }
        return true;
    }


    //打印数组
    private static void print() {
        System.out.printf("第%d种结果:", ++count);
        for (int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();
    }

}

从B站韩顺平老师的Java数据结构与算法习得。

Top