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皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯 2n皇后问题

蓝桥杯训练 2n皇后

蓝桥杯C/C++VIP试题每日一练之2n皇后问题

[蓝桥杯][基础练习VIP]2n皇后问题

2n皇后问题

蓝桥--2n皇后问题(递归)--搬运+整理+注释