八皇后问题的Java实现

/**
 * 用一个一维数组表示
 * arr[7] = 0,1,2,3,4,5,6,7
 * arr[i] = val  第i+1个皇后,放在第i+1行,第val列
 * 一个一维数组,就表示一组解
 */
public class Queue8 {
    int max = 8;   // 表示皇后的数量
    int[] arr = new int[max];
    public static void main(String[] args) {
        Queue8 queue8 = new Queue8();
        queue8.put(0);
    }

    // 放置第n-1个皇后的方法
    public void put(int n){
        // n从0开始,当 n = max = 8 时,表示已经开始放第九个皇后了
        // 此时前8个皇后已经放置完成,就输出这个结果后返回
        if(n == max){
            print();
            return;
        }
        // 如果前8个还没有放置好,就需要递归去判断位置是否冲突
        for (int i = 0; i < max; i++) {
            // 新放置的皇后,从每行的第一列开始摆放
            // 如果不冲突,放置并判断下一个(递归)
            arr[n] = i;
            if(isRight(n)){
                put(n+1);
            }
            // 如果位置不正确,isRight(n) 返回false
            // 就不会进入if语句
            // 会继续执行for循环,i++,放置在下一个位置,继续判断
        }

    }

    // 判断摆放位置是否正确
    public boolean isRight(int n){  // n从0开始,判断的是第n-1个皇后
        /**
         * 假如现在要判断第二个皇后的位置是否满足要求,就需要判断和第一个皇后的位置是否冲突
         * 此时,n = 1, i从0开始,i < n,就是 i < 1,只判断一次
         * arr[]数组存放的每一个元素的具体值,代表的是皇后所在的列,而下标,用来表示第几个皇后以及第几行
         * 假如第一个皇后放在第一行第一列,则就表示为 arr[0] = 0
         * 第二个皇后就是arr[1],  如果 arr[1] = 0, 表示放在第二行的第一列,就和第一个皇后冲突了
         * 具体值相等,就意味着在同一列,是不符合要求的
         * 如果第二个皇后放在第二列,就表示为 arr[1] = 1
         * 此时,abs(n-i) = 1-0 = 1,  abs(arr[1] - arr[0]) = 1 - 0 = 1
         * 此时它们在同一斜线上,不符合要求
         * 也就是,具体值的差,刚好等于了索引下标的差,就意味着在一条斜线上了
         *
         */
        for (int i = 0; i < n; i++) {
            if(arr[i] == arr[n] || Math.abs(n-i) == Math.abs(arr[n] - arr[i])){
                return false;
            }
        }
        return true;
    }

    // 显示结果
    public void print() {
        for (int i = 0; i < max; i++) {
            System.out.print(arr[i]);
        }
        System.out.println();    // 打印完一组解后再换行
    }
}

你可能感兴趣的:(java,开发语言,算法)