62.N皇后
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例1:

输入: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] = '.';
}
}
}
}

浙公网安备 33010602011771号