难度:困难
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4 输出: 2 解释: 4 皇后问题存在如下两个不同的解法。 [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ]
提示:
题目解析:
题目很明显是回溯法,基于上一题,这题只需算几种解法,所以在上题的基础上修改成计数即可
参考代码:
class Solution {
public:
int res = 0;
int totalNQueens(int n) {
if (n < 1)
return res;
int* arr = new int[n];
for (int i = 0; i < n; i++)
{
arr[i] = i;
}
str_pl(arr, n, 0);
return res;
}
bool is_q(int* arr, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
//i-j或者j-i对应的是高度,arr[i] - arr[j]对应的是宽度,
//当这个高度和宽度相等时,说明在同一对角线上,是不行的
if ((i - j) == (arr[i] - arr[j]) || (j - i) == (arr[i] - arr[j]))
return false;
}
}
return true;
}
void str_pl(int* arr, int n, int index)
{
//结束条件,说明已经排列好了
if (index == n)
{
//先检查这个排列是否符合条件
if (is_q(arr, n))
{
res++;
}
}
else
{
for (int p = index; p < n; p++)
{
swap(arr[p], arr[index]);
str_pl(arr, n, index + 1);
swap(arr[p], arr[index]);
}
}
}
};