用C++解决n皇后问题
时间: 2023-12-01 21:58:22 浏览: 33
n皇后问题是一个经典的回溯算法问题,可以用C++来解决。下面是一个例子:
```c++
#include<iostream>
using namespace std;
const int N = 20;
int n;
int col[N], dg[N], udg[N]; // 列、正对角线、反对角线是否有棋子
void dfs(int u)
{
if (u == n) // 找到一组解
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j == col[i]) cout << "Q ";
else cout << ". ";
}
cout << endl;
}
cout << endl;
return;
}
for (int i = 0; i < n; i++) // 枚举每行所放置的列
{
if (!col[i] && !dg[u + i] && !udg[n - u + i]) // 判断该列是否已有棋子
{
col[i] = dg[u + i] = udg[n - u + i] = 1; // 标记该列、正对角线、反对角线已有棋子
dfs(u + 1); // 继续向下一行搜索
col[i] = dg[u + i] = udg[n - u + i] = 0; // 回溯,恢复标记
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}
```
该程序使用了回溯算法,对于每一行枚举每个列,判断是否能放置皇后,如果能,则标记该列、正对角线、反对角线已有棋子,并继续向下一行搜索,如果不能,则回溯并恢复标记。当搜索到最后一行时,即找到一组解。