八皇后问题

8 篇文章 0 订阅

洛谷

https://www.luogu.org/problemnew/show/P1219

皇后从第一行开始,向第n行放置,每一行又搜索每一列的位置,检查是否符合要求。

#include<iostream>
#include<cstdio>
using namespace std;
void dfs(int x);
int col[30],v1[30],v2[30],ans=0,n;
int a[30];
int main()
{
	scanf("%d",&n);
	dfs(1);//从第一行第一个位置开始 
	printf("%d",ans);
	return 0;
}
void dfs(int x)		//x行数 
{
	if(x>n)//x已经遍历完所有的行 
	{
		ans++;
		if(ans<=3)
		{
			for(int j=1;j<=n;j++)
				printf("%d ",a[j]); 
			cout<<endl;
		} 
		
	}
	else
	{
		for(int i=1;i<=n;i++)	//i列数 
		{
			if(!col[i]&&!v1[x-i+13]&&!v2[x+i])//col[i]同一列, v1[x-i+13]同一副对角线, v2[x+i]同一主对角线 
			{
				col[i] = 1;//占领列 
				v1[x-i+13] = 1; //占领副对角线 (如何判断在同一副对角线,行号-列号的值相同,即为同一副对角线。为防止x-i为负数,故加上一个合适常数,防止数组下标是负数)
				v2[x+i] = 1;//占领主对角线 (行号+列号相同,即为同一主对角线)
				a[x] = i;//记录当前列 
				dfs(x+1);
				col[i] = 0;
				v1[x-i+13] = 0; 
				v2[x+i] = 0;
			}
		}
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二中卢老师

创作不易,你的鼓励是我最大的动

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值