843. n-皇后问题
https://www.acwing.com/problem/content/845/
经典暴搜题,有多种写法,这里用dfs按行搜索
用col,dg,udg确定此位置是否可以放棋子,对于dg,udg,有斜率为1,-1的直线方程,根据截距的不同可以确定不同的直线
按行搜索,可以不用row,因为每行只会放一个棋子,放完棋子后直接继续搜索下一行了
#include<iostream>
using namespace std;
const int N = 10;
char map[N][N];
int n;
bool col[N],dg[N],udg[N];//列,正斜率对角,负斜率对角
void dfs(int x)
{
if(x==n)//枚举到最后一行
{
for(int i=0;i<n;i++)
cout << map[i] << endl;
puts("");
return;
}
for(int i=0;i<n;i++)//枚举第x行,查看哪一列可以放棋子,这样枚举一行只有一个棋子能放
{
if(!col[i] && !dg[i-x+n] && !udg[x+i])//此列,此对角线,此负对角线都没有棋子
{
map[x][i]='Q';
col[i]=dg[i-x+n]=udg[x+i]=true;
dfs(x+1);
col[i]=dg[i-x+n]=udg[x+i]=false;//恢复现场
map[x][i]='.';
}
}
}
int main()
{
cin >> n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map[i][j]='.';
dfs(0);
}