学习笔记-回溯算法(八皇后问题)暴力法

八皇后问题暴力解决法(介绍代码有说明)

先展示结果:
在这里插入图片描述

我这里用的是一维数组来展示的结果
array={7,3,0,2,5,1,6,4}
7的下标为0, 在这里下标+1表示的是第几个皇后也是行的位置,array[n]+1的值就是皇后所在列的位置,即:
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1

下面是代码演示:

//定义一个max表示一共有多少皇后
    int max = 8;
    static int all = 0;
    //定义数组,保存皇后放置后位置的结果,比如arr={0,1,2,3,4,5,6,7}
    int[] array = new int[max];
    public static void main(String[] args) {
        //测试
        Queue8 queue8 = new Queue8();
        queue8.check(0);
        System.out.println(all);
    }

    //特别注意!!!
    //每一个check都有for (int i =0; i < max; i++)因此会出现回溯
    private void check(int n){
        if (n == max){
            print();
            return;
        }
        //一次放入皇后判断是否冲突
        for (int i =0; i < max; i++){
            //先吧当前皇后放到第1列
            array[n] = i;
            //判断放置第n个皇后到i列时,是否冲突
            if (judge(n)){ //不冲突
                //接着放置第n个皇后 递归开始
                check(n+1);
            }
            //如果冲突就继续执行array[n] = i;即将第n个皇后,放置在本行的后移一个位置
        }
    }
    /**
     *  判断是否符合位置
     * @param n 表示第几个皇后
     * @return 是否
     */
    private boolean judge(int n){
        for (int i = 0; i < n; i++){
            //说明
            //1.array[i] == array[n]  表示判断第n个皇后是否与n-1个皇后处于同一列
            //2.Math.abs(n - i) == Math.abs(array[n] - array[i])  表示判断第n个皇后是否处于第i个皇后的同一斜线
            if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])){
                return false;
            }
        }
        return true;
    }
    //写一个方法,可以将皇后位置摆放输出
    private void print(){
        for (int i = 0; i < array.length; i++){
            System.out.printf(array[i] + " ");
        }
        all++;
        System.out.println();
    }
原创文章 23 获赞 23 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Shine_QianMo/article/details/105915936