1404: [蓝桥杯]2n皇后问题
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1404: [蓝桥杯]2n皇后问题相关的知识,希望对你有一定的参考价值。
就是全排列嵌套,再来一个数组来判断当前的坑位可不可以填
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
bool st1[10],st2[10];
bool vis[10][10];//第几个坑,第几个数 vis[1][7] 表示第一列,第7个数可不可以填
int a1[10],a2[10];
int b[10][10];
int ans=0;
void dfs2(int index)
{
for(int i=1;i<index;i++)
for(int j=i+1;j<index;j++)
if(abs(i-j)==abs(a2[i]-a2[j])) return;
if(index==n+1)
{
ans++;
return ;
}
for(int i=1;i<=n;i++)
{
if(!vis[index][i]&&!st2[i])//如果说当前坑位的数可以选,且这个数没有被选过。
{
st2[i]=true,vis[index][i]=true,a2[index]=i;
dfs2(index+1);
st2[i]=false,vis[index][i]=false,a2[index]=0;
}
}
}
void dfs1(int index)//当前该看哪个
{
for(int i=1;i<index;i++)
for(int j=i+1;j<index;j++)
if(abs(i-j)==abs(a1[i]-a1[j])) return;
if(index==n+1)
{
dfs2(1);
return ;
}
for(int i=1;i<=n;i++)
{
if(!vis[index][i]&&!st1[i])//如果说当前坑位的数可以选,且这个数没有被选过。
{
st1[i]=true,vis[index][i]=true,a1[index]=i;
dfs1(index+1);
st1[i]=false,vis[index][i]=false,a1[index]=0;
}
}
}
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>b[i][j];
if(!b[i][j]) vis[j][i]=true;
}
}
dfs1(1);
cout<<ans<<endl;
return 0;
}
以上是关于1404: [蓝桥杯]2n皇后问题的主要内容,如果未能解决你的问题,请参考以下文章