检查之前的每一行 j 中的皇后位置 ny = cur.get(j);如果 ny == y,说明当前列有冲突。如果 Math.abs(ny - y) == Math.abs(j - x),说明在对角线上有冲突。
如果都不冲突,返回 true,表示当前位置安全。
回溯算法通过尝试在每一行的每一列放置皇后,并通过递归处理后续行来探索所有可能的放置方案。judge 方法用于在放置之前检查是否会产生冲突。最终 res 记录了所有合法的方案数量。
java复制代码
class Solution {
Integer res = 0;
LinkedList<Integer> cur = new LinkedList<>();
public int totalNQueens(int n) {
backtrack(n, 0);
return res;
}
public void backtrack(int n, int index) {
if (index >= n) {
res++;
return;
}
for (int i = 0; i < n; i++) {
if (judge(index, i)) {
cur.add(i);
backtrack(n, index + 1);
cur.removeLast();
}
}
}
public Boolean judge(int x, int y) {
for (int j = 0; j < x; j++) {
int ny = cur.get(j);
if (ny == y || Math.abs(ny - y) == Math.abs(j - x)) {
return false;
}
}
return true;
}
}