蓝书-hdu2553 N皇后问题(搜索-回溯)

题目

N皇后问题(N<=10)

思路来源

蓝书

题解

回溯法,大概入门了

就是枚举每个当前可行状态

然后check当前状态和之前的状态是否冲突

如果冲突就不递归下一层,相当于在搜索树里剪枝剪掉了

否则就搜下一层

 

预处理打表,不然必然会T

 

另外考虑一个二维平面,

y-x相同,不妨y=x+k,两点在y=x+k上说明副对角线相同

y+x相同,亦有y+x=b,y=-x+b主对角线相同

都是要剪掉的类型

这里我们按行增序枚举,所以只可能出现列的冲突

精简干练的短代码题要优先掌握啊不然怎么提升码力

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
	int x,y;
}step[11];
int n,ans[11];
bool vis[11];
void dfs(int pos,int num)
{
	if(pos==num)
	{
		ans[num]++;
		return;
	}
	for(int i=1;i<=num;++i)
	{
		if(vis[i])continue;
		step[pos].x=1+pos;step[pos].y=i;
		bool flag=1;
		for(int j=0;j<pos&&flag;++j)
		{
			if(step[j].y-step[j].x==step[pos].y-step[pos].x)flag=0;
			if(step[j].y+step[j].x==step[pos].y+step[pos].x)flag=0;
			if(step[j].y==step[pos].y)flag=0;
		}
		if(flag)
		{
			vis[i]=1;
			dfs(pos+1,num);
			vis[i]=0;
		}
	} 
}
void init()
{
	for(int i=1;i<=10;++i)
	{
		memset(vis,0,sizeof vis);
		dfs(0,i);
	}
}
int main()
{
	init();
	while(~scanf("%d",&n)&&n)
	printf("%d\n",ans[n]);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值