java回溯法解决n皇后问题

先看问题吧

问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

关于n皇后问题相关的解法很多,在这里大家可以看看我的写法,注释也比较详细了,需要注意的是就是大家怎么去思考这个问题,怎么理解行,列,对角线的冲突。

好了贴代码:


class Solve {
    int q;// 皇后个数
    int[] a;// 存放皇后的数组
    int sum = 0;// 解的个数

    // 设置皇后个数
    public int total(int q) {
        this.q = q;
        a = new int[q + 1];
        back(1);
        return sum;
    }

    /*
     * 判断当前位置是否放置皇后 对角线冲突条件 Math.abs(h-i)==Math.abs(a[h]-a[i]) 列冲突条件 a[h]==a[i]
     * h是当前所在的行 当前行的所有元素与前几行的元素做对比,不满足一旦冲突就返回,就是回溯的条件
     */
    private boolean place(int h) {
        for (int i = 1; i < h; i++) {
            if (Math.abs(h - i) == Math.abs(a[h] - a[i]) || a[h] == a[i]) {
                return false;
            }
        }
        return true;
    }

    // 回溯
    private void back(int s) {
        if (s > q) {
            // 第一层的当前位置的情况 找到了一个解 需执行第一层第二个位置
            sum++;
        } else {
            // q皇后数
            for (int i = 1; i <=q; i++) {
                a[s] = i;// 每一层皇后的位置
                // 判断当前层的位置是否能存放皇后
                if (place(s)) {
                    // 如果符合需求进入下一层 但是要注意当前的for循环是否结束完成这里是回溯的难点
                    back(s + 1);
                }
            }
        }
    }

}

public class Nqueen {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Solve s = new Solve();
        System.out.println(s.total(8));

    }

}


你可能感兴趣的:(蓝桥杯,算法)