class Solution {
/**
* Calculate the total number of distinct N-Queen solutions.
* @param n: The number of queens.
* @return: The total number of distinct solutions.
*/
public static int sum;
public int totalNQueens(int n) {
sum = 0;
ArrayList<Integer> list = new ArrayList<>();
helper(list, n);
return sum;
}
/**
* 递归方法
* @param list : 已确定的queen的位置
* @param n : queen的总个数
*/
private void helper(ArrayList<Integer> list, int n) {
// 退出条件,控制树的深度
if (list.size() == n) {
sum++; // 找到一个解
return;
}
for (int i = 0; i < n; i++) {
// 控制分支
if (!isValid(list, i)) {
continue;
}
list.add(i);
helper(list, n);
list.remove(list.size() - 1);
}
return;
}
/**
* 判断是queen是否可以相互攻击
* @param list : 已确定的queen的位置
* @param col : 新的一行中queen的位置
*/
private boolean isValid(ArrayList<Integer> list, int col) {
if (list.size() == 0) {
return true;
}
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == col) {
return false;
}
// 列 - 行
if (list.get(i) - i == col - list.size()) {
return false;
}
// 列 + 行
if (list.get(i) + i == col + list.size()) {
return false;
}
}
return true;
}
};
[刷题]N-Queens II
最新推荐文章于 2022-06-05 10:13:24 发布
本文详细介绍了如何使用递归方法解决N皇后问题,并通过一个具体的类Solution展示了求解过程,包括验证皇后位置是否冲突的逻辑。
340

被折叠的 条评论
为什么被折叠?



