优质题解:2n皇后问题
2020-02-28 本文已影响0人
桐桑入梦
原题链接:[蓝桥杯][基础练习VIP]2n皇后问题
解题思路:
首先理解八皇后,然后就是一个使用两个八皇后叠加的问题,通过多设置几个数组就可以实现2*n皇后的问题,注意定义数组记录是否访问这一行或者这一列的时候,数组的值要大一些,防止数组越界。
然后就是一个最基本的DFS就可以了。
#include<cstdio>
#include<cstring>
int a[9][9],vis1[9],vis2[9],cnt,n;
int x1[19],x2[19],y1[19],y2[19];
void DFS(int dep)
{
if(dep==n+1) { cnt++; return ;}
for(int i=1;i<=n;i++)
{
if(!vis1[i] && a[dep][i] && !x1[dep+i] && !y1[dep-i+n])
{
vis1[i]=1; a[dep][i]=0; x1[dep+i]=1; y1[dep-i+n]=1;
for(int j=1;j<=n;j++)
{
if(!vis2[j] && a[dep][j] && !x2[dep+j] && !y2[dep-j+n])
{
vis2[j]=1;a[dep][j]=0; x2[dep+j]=1; y2[dep-j+n]=1;
DFS(dep+1);
vis2[j]=0;a[dep][j]=1; x2[dep+j]=0; y2[dep-j+n]=0;
}
}
vis1[i]=0; a[dep][i]=1; x1[dep+i]=0; y1[dep-i+n]=0;
}
}
}
int main(void)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
DFS(1);
printf("%d",cnt);
return 0;
}