N皇后问题
按行枚举,抽象问题来作剪枝:按行枚举已经保证一行只有一个皇后,所以只需判断当前位置的同一列、对角线、反对角线是否有皇后即可。
#include<iostream>
using namespace std;
int n;
// bool数组用来判断搜索的下一个位置是否可行
// col列,dg对角线 y = x + b,udg反对角线 y = -x + b
// g[N][N]用来存路径
const int N = 10010;
char g[N][N];
bool col[N],dg[N],udg[N];
void dfs(int u)
{
// u == n 表示已经搜了n行,故输出这条路径
if(u == n)
{
for(int i = 0;i < n;i++)
{
for(int j = 0; j < n;j++)
{
cout << g[i][j];
}
cout <<endl;
}
cout <<endl;
return;
}
// 枚举u这一行,搜索合法的列
int x = u;
for(int y = 0; y < n;y++)
{
// 剪枝(对于不满足要求的点,不再继续往下搜索)
if(!col[y] && !dg[y-x+n] && !udg[y+x])
{
g[x][y] = 'Q';
col[y] = dg[y-x+n] = udg[y+x] = true;
dfs(x+1);
// 恢复现场
g[x][y] = '.';
col[y] = dg[y-x+n] = udg[y+x] = false;
}
}
}
int main()
{
cin >> n;
for(int i = 0;i < n;i++)
{
for(int j = 0; j < n;j++)
{
g[i][j] = '.';
}
}
dfs(0);
return 0;
}