62.N皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例1:
image

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例2:

输入:n = 1
输出:[["Q"]]

提示:

  • 1 <= n <= 9

代码:

class Solution {
    //mp为棋盘数组,用于记录棋盘状态
    char[][] mp;
    //res用于存储所有满足n皇后问题的棋盘状态
    List<List<String>>res = new ArrayList<>();
    //col用于判断列是否已经被标记,left用于判断左对角线是否已经被标记,right用于判断右对角线是否已经被标记
    int[] col,left,right;
    public List<List<String>> solveNQueens(int n) {
        //初始化
        mp = new char[n][n];
        col = new int[n];
        left = new int[2*n];
        right = new int[2*n];
        for(int i = 0 ;i<n;i++){
            for(int j = 0;j<n;j++)mp[i][j]='.';
        }
        //递归寻找满足n皇后问题的棋盘状态
        dfs(0,n);
        //返回res
        return res;
    }
    public void dfs(int u,int n){
        //如果已经遍历完了n行,说明当前棋盘状态满足n皇后问题
        if(u==n){
            //list逐行存储当前棋盘状态
            List<String>list = new ArrayList<>();
            for(int i = 0;i<n;i++)list.add(new String(mp[i]));
            //将list添加到res中
            res.add(list);
            //直接返回
            return;
        }
        for(int i = 0;i<n;i++){
            //如果当前行、左对角线、右对角线未被标记,说明当前位置可以放棋子
            if(col[i]==0&&left[i-u+n]==0&&right[u+i]==0){
                //标记当前行
                col[i] = 1;
                //标记左对角线
                left[i-u+n] = 1;
                //标记右对角线
                right[u+i] = 1;
                //将当前位置放置棋子
                mp[u][i] = 'Q';
                //递归遍历下一行
                dfs(u+1,n);
                //回溯,恢复状态
                col[i] = 0;
                left[i-u+n] = 0;
                right[u+i] = 0;
                mp[u][i] = '.';
            }
        }
    }
}
posted @ 2025-05-04 09:33  回忆、少年  阅读(40)  评论(0)    收藏  举报