LeetCode 51. N 皇后
原题链接
困难
作者:
LangB
,
2020-10-31 16:06:12
,
所有人可见
,
阅读 239
class Solution {
// n为矩阵的长宽
int n;
// 结果LIST
List<List<String>> res;
// col为记录当前列是否存在棋子
// dg和udg记录两个方向的对角线是否存在棋子
boolean[] col, dg, udg;
// chess为棋盘
char[][] chess;
public List<List<String>> solveNQueens(int n) {
// 初始化
this.n = n;
res = new ArrayList<>();
col = new boolean[n];
dg = new boolean[2 * n];
udg = new boolean[2 * n];
chess = new char[n][n];
// 将棋盘初始化为"."
for (char[] chars : chess) {
Arrays.fill(chars, '.');
}
// 按照行进行搜索
dfs(0);
return res;
}
private void dfs(int r) {
if (r == n) {
// 如果r == n,则说明已经全部放置完了,然后将棋盘的结果转为LIST加入进res
List<String> list = new ArrayList<>();
for (char[] chars : chess) {
list.add(new String(chars));
}
res.add(list);
return;
}
for (int i = 0; i < n; i++) {
// 如果该位置可以放置棋子,则从这开始往下搜索
if (!col[i] && !dg[r - i + n] && !udg[r + i]) {
col[i] = dg[r - i + n] = udg[r + i] = true;
chess[r][i] = 'Q';
dfs(r + 1);
chess[r][i] = '.';
col[i] = dg[r - i + n] = udg[r + i] = false;
}
}
}
}