class Solution {
// 结果集
private List<List<String>> res = new ArrayList<>();
// 空白格
private String empty;
public List<List<String>> solveNQueens(int n) {
StringBuilder sb = new StringBuilder();
// 字符串追加
for (int i = 0; i < n; i++) {
sb.append('.');
}
this.empty = sb.toString();
// 回溯, 返回结果集
backtrack(new ArrayList<>(), n);
return res;
}
private void backtrack(List<String> acc, int n) {
// 终止条件
if (acc.size() == n) {
// 查询结果条件
res.add(acc);
return;
}
// 处理当前层逻辑
boolean[] taken = new boolean[n];
for (int i = 0; i < acc.size(); i++) {
// 对角棋子
int delta = acc.size() - i;
String prev = acc.get(i);
for (int j = 0; j < n; j++) {
// 确认皇后位置,结束条件
if (prev.charAt(j) == 'Q') {
taken[j] = true;
if (j + delta < n) {
taken[j + delta] = true;
}
if (j - delta >= 0) {
taken[j - delta] = true;
}
break;
}
}
}
StringBuilder sb = new StringBuilder(empty);
// 遍历
for (int i = 0; i < n; i++) {
if (!taken[i]) {
sb.setCharAt(i, 'Q');
List<String> next = new ArrayList<>(acc);
next.add(sb.toString());
// 递归调用下一层
backtrack(next, n);
sb.setCharAt(i, '.');
}
}
}
}
LeetCode 51 N皇后(java)
最新推荐文章于 2021-06-21 20:53:30 发布