八皇后问题(java实现)

八皇后问题分析(回溯算法):
1.第一个皇后先放在第一行第一列
2.第二个皇后放在第二行第一列,然后判断是否与前面放置的皇后冲突,继续放在第二列,第三列,直到找到合适的。
3.继续第三个皇后,还是第一列,第二列…直到第八个皇后也放在一个合适的位置,到此,找到一个正确的解。
4.在得到一个正确的解时,就栈回退到上一个栈时,就开始回溯,将第一个皇后放在第一列的所有正确解得到。
5.然后继续讲第一个皇后放在第二列,第三列…继续执行1,2,3,4步骤。

public class BaHuangHou {
    //max表示有几个皇后
    int max=8;
    /**
     *  定义数组array,保存皇后放置位置的结果,比如:array{1,2,3},表示分别放在第一行第二列,
     *  第二行第三列,第3行第四列
     */
    int array[]=new int[max];
    //计算一共有多少种结果
    static int count=0;
    public static void main(String[] args) {
        BaHuangHou baHuangHou = new BaHuangHou();
        baHuangHou.check(0);
        System.out.println("一共有"+count+"种方法");

    }
    
    //放置第n个皇后
    private void check(int n){
        if (n==max){    //n=8时,8个皇后已经放好
            print();
            return;
        }
        //依次放入皇后,并判断是否冲突
        for (int i = 0; i <max; i++) {
        	//把当前皇后放在该行的第i列
            array[n]=i;
            //判断第n个皇后放到第i列是否冲突
            if (judge(n)){	
            //如果不冲突,继续放n+1个皇后,开始递归
                check(n+1);
            }
            //如果冲突,将执行 array[n]=i,将该皇后放在该行后移的一个位置(i++)
        }
    }

    //查看当前摆放的第n个皇后,是否和前面的有所冲突
    private boolean judge(int n){
        for (int i = 0; i <n ; i++) {
            /**
             *  array[i]==array[n] 表示在同一列
             *  Math.abs(n-i)== Math.abs(array[n]-array[i]) 表示在同一斜线(行差=列差)
             */
            if (array[i]==array[n]||Math.abs(n-i)== Math.abs(array[n]-array[i])){
                return false;
            }
        }
        return true;
    }

    //输出皇后摆放位置输出
    private void print(){
        count++;
        for (int i = 0; i <array.length ; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
}

部分结果展示:一共有92种
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值