请生成这道题的c++代码:问题描述 给定一个n*n的棋盘。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。 问总共有多少种放法? 输入格式 输入的第一行包含一个整数 n。 输出格式 输出一行包含一个整数,表示答案。 样例输入 4 样例输出 2 评测用例规模与约定 共有 10 个评测用例,评测用例各不相同。 对于所有评测用例,2 <= n <= 11。
时间: 2024-02-12 20:04:32 浏览: 109
用C++实现的n皇后问题
以下是该问题的C++代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
const int N = 15;
int n;
int ans;
bool col[N], dg[N], udg[N];
vector<int> path;
void dfs(int u) {
if (u == n) {
ans++;
return;
}
for (int i = 0; i < n; i++) {
if (!col[i] && !dg[n - u + i] && !udg[u + i]) {
col[i] = dg[n - u + i] = udg[u + i] = true;
path.push_back(i);
dfs(u + 1);
col[i] = dg[n - u + i] = udg[u + i] = false;
path.pop_back();
}
}
}
int main() {
cin >> n;
dfs(0);
cout << ans << endl;
return 0;
}
```
解释:
该题可以使用回溯算法来解决。首先定义三个数组记录列、对角线和反对角线是否已经被占用,然后从第一行开始,依次枚举每一列,如果该列、对角线和反对角线都没有被占用,则将该位置标记为占用,并将该列的坐标添加到路径中,进入下一行进行递归。如果当前行已经到达最后一行,则将答案加一并返回。如果当前行的所有列都无法放置皇后,则回溯到上一行,将该位置标记为未占用,并将该列的坐标从路径中删除,继续枚举下一列。最后输出答案即可。
阅读全文