java数据结构与算法刷题-----LeetCode51. N 皇后

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

在这里插入图片描述

解题思路:时间复杂度O( N ! N! N!),空间复杂度O( n n n)
  1. 用一个数组来表示每个皇后所在列数
  2. 而数组下标就是每个皇后所在行数。我们规定,第0个皇后就在第0行,第1个皇后就在第1行,所以只需要一个数组
  3. 那么我们想要安排一个新的皇后入棋牌时,要看看是否和前面的皇后冲突
  1. 如果和前面的皇后在同一列,就说明冲突
  2. 如果当前皇后想要插入的行和列,和前面皇后的行和列,在同一斜线,就说明冲突, 具体判断规则如下:
    两个皇后的行数相减后的绝对值 = 列数相减后的绝对值,就说明两个皇后在一个对角线。因为棋牌是正方形的。也就是Math.abs(A.row - B.row) == Math.abs(A.column - B.column). A和B是两个皇后,row代表皇后所在行,column表示皇后所在列
代码

在这里插入图片描述

class Solution {
    List<List<String>> ans = new ArrayList<List<String>>();//保存答案
    int[] positions;//保存皇后所在列(下标代表第几个皇后(第几个就在第几行),元素值代表这个皇后在第几列)
    int n;//n皇后问题
    public List<List<String>> solveNQueens(int n) {
        this.n = n;this.positions = new int[n];
        backTracking(0);
        return ans;
    }
    //回溯,index表示当前是第几个皇后(第几行)
    public void backTracking(int index){
        if(index == n){//当所有皇后都成功安排好后,保存答案
            ArrayList<String> list = new ArrayList<>();
            for(int column: positions){
                char[] records = new char[n];
                Arrays.fill(records,'.');
                records[column] = 'Q';//皇后在的位置,换位Q
                list.add(new String(records));
            }
            ans.add(list);
        }else{//没安排好,就枚举这个皇后的位置
            for(int i = 0;i<n;i++){
                if(isConflicted(positions,index,i)) continue;//如果index行的皇后选择当前i列会冲突,就跳过
                positions[index] = i;//否则尝试选择i列
                backTracking(index+1);//回溯
            }
        }
    }
    //第index个皇后,放在column列是否会冲突?
    public boolean isConflicted(int[] positions,int index,int column){
        for(int i = 0;i<index;i++){//依次遍历index前面的皇后,看看是否和index冲突
            if(column == positions[i]) return true;//如果同一列就说明冲突
            if(Math.abs(index - i) == Math.abs(positions[i] - column)) return true;//如果在同一斜线,说明冲突
        }
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

殷丿grd_志鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值