dfs在之前也有讲过,有兴趣可以戳蓝字->dfs全排列
我们先画图模拟下过程吧(电脑画图不太会,手绘将就一下吧)
条件满足
条件:任意两个皇后都不能处于同一行、同一列或同一斜线上
处理:
同一行:每次放完Q就处理下一行
同一列:用line[l]做标记
同一斜线:Q不放在dg[n-l+r] 和udg[l+r]
代码演示:
#include<iostream>
using namespace std;
const int N=10;
//标记两条斜线上和列上对应的点是否有皇后
int dg[2*N],udg[2*N],line[N],n;
char a[N][N];//用二维数组表棋盘
void dfs(int r)
{
if(r==n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<a[i][j];
}
cout<<endl;
}
cout<<endl;
return;
}
for(int l=0;l<n;l++)
{
if(!dg[n-l+r]&&!udg[l+r]&&!line[l])
{
a[r][l]='Q';
dg[n-l+r]=udg[l+r]=line[l]=1;
//标记对应的斜线和列上已经有了皇后
dfs(r+1);//到下一行
dg[n-l+r]=udg[l+r]=line[l]=0;//清除标记
a[r][l]='.';//重置棋盘
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]='.';
}
}
dfs(0);
return 0;
}