08N皇后
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
List<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
dfs(n,0,new ArrayList<>());
return res;
}
private void dfs(int n ,int row,List<Integer> queues){
if(row == n){
List<String> board = new ArrayList<>();
for (Integer queue : queues) {
int n1 = queue%n;
StringBuilder builder = new StringBuilder();
for (int i = 0; i < n; i++) {
if(n1==i){
builder.append("Q");
}else{
builder.append(".");
}
}
board.add(builder.toString());
}
res.add(board);
}
for (int i = 0; i < n ; i++) {
int index = n*row+i;
if(check(index,n,queues)){
queues.add(index);
dfs(n,row+1,queues);
queues.remove(queues.size()-1);
}
}
}
private boolean check(int index,int n , List<Integer> queues){
int m1 = index/n;
int n1 = index%n;
for (Integer queue : queues) {
int m2 = queue/n;
int n2 = queue%n;
if(m1==m2 || n1==n2){
return false;
}
if(Math.abs(m1-m2) == Math.abs(n1-n2)){
return false;
}
}
return true;
}08N皇后
https://jiajun.xyz/2026/02/23/算法/10回溯/08N皇后/