- 题目
皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
- 示例
输入:n = 4
输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]
- 算法
注释
- 代码
class Solution {
List<List<String>> res = new ArrayList<>();
char[][] cur;
// 标记每一列是否用过
boolean[] col;
// 标记主对角线是否用过
boolean[] dig;
// 标记副对角线是否用过
boolean[] udig;
public void dfs(int n, int i) {
// i表示行数,要为第n行选点了,说明找到了最终结果
if (i == n) {
res.add(parse(cur));
return;
}
// 遍历第i行每一个可能的点(i,j)
for (int j = 0; j < n; j++) {
// 如果(i,j)点用过
if (col[j] || dig[i+j] || udig[i-j+n]) {
continue;
}
col[j] = true;
dig[i+j] = true;
udig[i-j+n] = true;
cur[i][j] = 'Q';
dfs(n, i + 1);
col[j] = false;
dig[i+j] = false;
udig[i-j+n] = false;
cur[i][j] = '.';
}
}
public List<String> parse(char[][] cur) {
List<String> list = new ArrayList<>();
for (char[] str : cur) {
list.add(new String(str));
}
return list;
}
public List<List<String>> solveNQueens(int n) {
cur = new char[n][n];
col = new boolean[n];
dig = new boolean[2*n];
udig = new boolean[2*n];
for (char[] arr : cur) {
Arrays.fill(arr, '.');
}
dfs(n, 0);
return res;
}
}