java数据结构 八皇后问题

目录

一、八皇后思路

二、代码

三.回溯思路


一、八皇后思路

八皇后的规则 :任意两个皇后之间不能在同一行 同一列 和不能在同一斜线

思路:

1.我们使用一个以为数组表示这个棋盘:例如0就是第一行第一个元素,2就是第二行第三个元素,5就是第三行第6个元素

2.创建规则参数接受 (在该行的第几个)判断 是否和之前的皇后 同一行 同一列  同一斜线 如果是就返回false

3.每添加一个皇后,就将这个皇后和之前添加的每个皇后进行规则的比较,如果满足规则就添加:

3.1第一个皇后先放第一行第一列

3.2第二个皇后放在第二行第一列、然后判断是否 OK, 如果不 OK,继续放在第二列、第三列、依次把所有列都 放完,找到一个合适

3.3 继续第三个皇后,还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置,算是找到了一个正确 解

3.4 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解, 全部得到.

5) 然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4

 

二、代码

public class Queue8 {
   static int max=8;
   int count=0;
   static int [] arr=new int[max];
    public static void main(String[] args) {
        Queue8 z = new Queue8();
        z.check(0);
        System.out.println(z.count);
    }



    private void check(int n){
        if (n==max){//n==8 表示 已经按照规则放好
            print();//输出可以的排序
            count++;
            return;
        }

        for (int i = 0; i <max ; i++) {
            arr[n]=i; //设置n为第i行
             if (Rules(n)){//如果判断规则合法
                check(n+1);//递归下一行
            }
        }      
        //for循环判断该行8次后发现都不符合规则
        //退出这个方法 就回溯到之前n进来的位置

    }

    //n 表示第n行皇后
    private boolean Rules(int n){
        for (int i = 0; i < n; i++) {
            //arr[n]==arr[i] 表示判断第n个皇后和第i个皇后是否在同一列
            //Math.abs(n-i)==Math.abs(arr[n]-arr[i]) 表示判断 是否在同一条斜线上
            //判断同一行没有必要写 因为n在递增
            if (arr[n]==arr[i]||Math.abs(n-i)==Math.abs(arr[n]-arr[i])){
                return false;
            }
        }
        return true;
    }
        //输出可以成功的方法
    private void print(){
        for (int i = 0; i < max; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();

    }

}

三.回溯思路

1.看图已知1-5列已经不能添加皇后(同列)

Math.abs(n-i)==Math.abs(arr[n]-arr[i])     {[0, 2, 4, 1, 3, 5, 0, 0]}

2.我们试着在第6列添加元素发现他和第一行第一列同斜线

abs5-0==abs(arr[5]-arr[0])        结果为false

Math.abs(n-i)==Math.abs(arr[n]-arr[i])     {[0, 2, 4, 1, 3, 7, 0, 0]}

3.在第8列添加元素发现他和第行第列同斜线

abs7-4==abs(arr[5]-arr[4])       结果为false

4.这个时候就要回溯回到第五行 看看五行有没有别的存放点如果有,将第五行的皇后点换到其他位置,再去查看第六行可不可以存放皇后,如果不能就继续回溯,第五行找不出其他位置就回溯到第四行


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值