题目一
解题思路
深度遍历+剪枝优化
第r行,第i列能不能放棋子:用数组dg udg cor 分别表示:点对应的两个斜线以及列上是否有皇后。
边界问题:
dg[i + r] 表示 r行i列处,所在的对角线上有没有棋子
udg[n - i + r]表示 r行i列处,所在的反对角线上有没有棋子
cor[i]表示第i列上有没有棋子。如果 r行i列的对角线,反对角线上都没有棋子
本来还要判断同一行上有没有棋子,代码中直接默认每行就一个所以省略掉了
如图示采样,“ \ ”方向的对角线横标和纵标之差值保持一致,“ / ”方向对角线横标和纵标之和值保持一致。故代码中使用布尔数组来表示某一对角线的情况,r-i+n取正。
代码模板
#include<iostream>
using namespace std;
int n;
const int N=11;
char q[N][N];
bool dg[N*2],udg[N*2],col[N];
void dfs(int r)
{
if(r==n)
{
for(int j=0;j<n;j++){
for(int k=0;k<n;k++)
{
cout<<q[j][k];
}
cout<<endl;
}
cout<<endl;
return;
}
for(int i=0;i<n;i++)
{
if(!dg[i+r]&&!udg[n-i+r]&&!col[i])
{
q[r][i]='Q';
dg[i+r]=udg[n-i+r]=col[i]=true;
dfs(r+1);
q[r][i]='.';
dg[i+r]=udg[n-i+r]=col[i]=false;
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
q[i][j]='.';
dfs(0);
return 0;
}