题目:
n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
示例 1:
输入:n = 4
输出:2
示例 2:
输入:n = 1
输出:1
提示:
1 <= n <= 9
class Solution {
int count = 0; //记录总数
int max = 0; //记录总的皇后数,即输入的n
int[] arr = null; //记录数组
public int totalNQueens(int n) {
max = n;
arr = new int[max];
queue(0); //从第一个位置开始递归
return count;
}
public void queue(int n) {
if (n == max) { //若完成全部皇后的安放,则计数+1,放回
count++;
return;
}
for (int i = 0; i < arr.length; i++) { //按列遍历
arr[n] = i; //确定当前皇后的位置,按行一个一个确定
if (judge(n)) {
queue(n+1);
}
}
}
//判断当前位置是否合法
public boolean judge(int n) {
for (int i = 0; i < n; i++) {
//对一维数组的假设,故不可能在同一列
//若同一行或在对角线位置,则返回false
if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
return false;
}
}
return true;
}
}
题解思路
①初始化一个数组(确定位置)、整数count(解决方案数)、整数max(皇后数);
②用方法queue做回溯,judge做每次安放皇后的位置判断是否合法;
③对数值的假设:列为严格递增(数组的索引),行即数组的值;
④按行确定每一个皇后的位置,位置合法才可以进入下一个皇后的安放(这些皇后所在列都是严格递增的,即数组的索引位),直到全部皇后安放成功count才会+1,再进行递归。