LeetCode 52. N皇后 II【递归、回溯】
难度: 困难
题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
[外链图片转存失败(img-k1ZXc9xM-1569454544680)(media/15683482588571/8-queens.png)] 上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4 输出: 2 解释: 4 皇后问题存在如下两个不同的解法。 [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ]
思路
和第51题基本一样,只是给函数加上了返回值,用来计算个数。
代码
class Solution {
public:
int totalNQueens(const int n) {
bool used[n + 1] = {
}; // 第i行是否有皇后
int permutation[n + 1] = {
}; // 当前排列
function<int(int, int, int)> n_queens;
n_queens = [&used, &permutation, &n_queens](int n, int index, int cnt)-> int {
if (index == n + 1) // 找到一个合法方案
return cnt + 1;
for (int x = 1; x <= n; ++x) {
// 第x行
if (not used[x]) {
bool flag = true; // 表示当前皇后不会和之前皇后冲突
for (int pre = 1; pre < index; ++pre) {
if (abs(index - pre) == abs(x - permutation[pre])) {
// 与之前的皇后在一条对角线上
flag = false;
break;
}
}
if (flag) {
permutation[index] = x;
used[x] = true;
cnt = n_queens(n, index + 1, cnt);
used[x] = false;
}
}
}
return cnt;
};
return n_queens(n, 1, 0);
}
};
上一篇:
IDEA上Java项目控制台中文乱码
