八皇后问题

package day9;

import java.lang.reflect.Array;

public class bahuanggou {
    //定义一个数组保存结果array
    int max =8;
    static int count=0;
    int[] arr =new int[max];
     public static void main(String[] args) {
         bahuanggou bahuanggou = new bahuanggou();
         bahuanggou.check(0);
         System.out.println(count);
     }


    //将皇后的位置输出---------------------------------------------------------------------
    private void print(){
         for (int i=0;i<arr.length;i++){
             System.out.print(arr[i]+" ");
         }
         count++;
        System.out.println();
    }
//  判断是否冲突 同一行,列,斜线。-----------------------------------------------------------
    //当我们放置第n个皇后时,就去检测该皇后和前面是否冲突。只需输入n就可以自己判断
    private boolean judge(int n){  //n表示第n个皇后
         for (int i=0;i<n;i++){
             if (arr[i]==arr[n]||Math.abs(n-i)==Math.abs(arr[n]-arr[i])){
                 return false;
                 //arr[i]==arr[n]表示判断第n个皇后和前面的皇后在同一列
//                 Math.abs(n-i)==Math.abs(arr[n]-arr[i])  判断是否在同一斜线。
//                斜率    arr[n]-arr[i]  /  n-i
//                 同一行不用判断

             }
         }
         return true;
    }
//-----------------------  编写方法,放置皇后。--------------------------------------------
    private void check(int n){
    if(n==max){   //每次都要插入八个皇后
        print();
        return;
    }
    for (int i=0;i<max;i++){ //依次放入皇后   i表示每一行的每一个列从0--8依此增长
        arr[n]=i;        //将第n个皇后先放在第i个位置   i从0--8增长。
        if (judge(n)){
            check(n+1);
            //判断此时的n皇后和前面的有没有冲突,没有冲突的话,就判断他的下一行。
            //有冲突的话,就把他移到下一个位置i。
            //每次判断都是一个试错的过程,1正确,2错误就要改变2,当2所以的位置都尝试了失败,
            // 就要回溯到1改变1的位置。

//思考:1.n=0,将第一个皇后放在第一个位置,判断位置通过,check(n+1)继续第二个皇后,从1-8,第一个位置冲突,i+1 ,移到了第二个位置
// 第二个也冲突。,i+1,第三个不冲突。第二个位置确定。第三个皇后,
// 第四个,第五个发现没有合适的,就要回溯第四个,再测试第五个还是没有合适,继续回溯第三个。直到所有的都找到。
//            皇后的移动:check(n+1)     列的遍历:i++
        }

    }
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值