景兄弟手撕算法之八皇后问题

package test1;

/**
 * 回溯思想,八皇后问题:任意两个皇后都不能处于同一行、同一列或同一斜线上
 */
public class BackTest {
    //皇后数组
    private int[] queen;

    public void backMethod(int n){
        //皇后数组初始化
        queen = new int[n];

        //初始化皇后起点
        for(int i=0;i<queen.length;i++){
            queen[i] = -1;
        }
        //从第一个皇后开始
        int k = 0;
        while (true){
            //第K个皇后要移动一个位置
            queen[k]+=1;
            //判断是否应该回到上一行搜索
            if(queen[k]>=n){
                //皇后越界,此行没有位置可以放置皇后
                if(k>0){
                    queen[k]=-1;
                    k--;
                    continue;
                }else {
                    break;
                }
            }
            if(!isMatch(k)){
                k++;
                if (k>=n){
                    for (int i=0;i<n;i++){
                        System.out.print(queen[i]+"");
                    }
                    System.out.println();
                    k--;
                }
            }
        }

    }
    //判断我们第K个皇后是否与之前之后的皇后冲突
    public boolean isMatch(int k){
        for (int i=k-1;i>-1;i--){
            if(queen[k]==queen[i] ||Math.abs(queen[k]-queen[i])==Math.abs(k-i)){
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        new BackTest().backMethod(8);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

景兄弟1366

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值