【日常学习】【深搜】codevs2452 扫雷题解

本文介绍了一个基于深度优先搜索(DFS)的算法,用于解决一种简化版的扫雷游戏问题。该游戏在一个n×2的棋盘上进行,目标是根据已知信息找出所有可能的雷的布局方案。文章提供了完整的实现代码,并解释了其背后的逻辑。

题目来源:05年四川省选

转载请注明出处 [ametake版权所有]http://blog.youkuaiyun.com/ametake欢迎来看 

题目描述 Description

      相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,

由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。

输入描述 Input Description

     第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)

输出描述 Output Description

     一个数,即第一列中雷的摆放方案数。

样例输入 Sample Input

2

1 1

样例输出 Sample Output

2

图片可以在网上找到,格子里的数字可以是0,不影响做题

据说网上有深搜的,动归的,还有模拟的。我这里是深搜的做法。

思路就是深搜的经典思路,对于每一个格子填或不填进行搜索,再消除影响。

代码:

//mine 扫雷 暴搜第一课
//copyright by ametake
//感谢里奥同学友情支援~ 
#include 
#include
#include
using namespace std;

const int maxn=10000+10;
int a[maxn];
int b[maxn];
int n,ans=0;

void dfs(int pos,int state)
{
//	if (pos>n)
//	{
//		ans++;
//		return;
//	}
	if (state==1)
	{
		if (pos-1>0) 
		{
			a[pos-1]++;
			//if (a[pos-1]!=b[pos-1]) return;
		}
		a[pos]++;
		//if (a[pos]>b[pos]) return;
		if (pos+1<=n)
		{
			a[pos+1]++;
			//if (a[pos+1]>b[pos+1]) return;
		}
		if ((a[pos-1]!=b[pos-1])||(a[pos]>b[pos])||(a[pos+1]>b[pos+1])) return;
		if (pos==n)
		{
			if (a[pos]==b[pos]) ans++;
			return;
		}
		dfs(pos+1,1);
		if (pos>0) a[pos]--;
		a[pos+1]--;
        if (pos+2<=n) a[pos+2]--;
        dfs(pos+1,0);
		//if (pos-1>0) a[pos-1]--;
		//a[pos]--;
        //if (pos+1<=n) a[pos+1]--;
	}
	else 
	{
		if (pos-1>0) 
		{
			if (a[pos-1]!=b[pos-1]) return;
		}
		if (pos==n)
		{
			if (a[pos]==b[pos]) ans++;
			return;
		}
		dfs(pos+1,1);
		if (pos>0) a[pos]--;
		a[pos+1]--;
        if (pos+2<=n) a[pos+2]--;
		dfs(pos+1,0);
	}
}

int main()
{
	freopen("mine.in","r",stdin);
	freopen("mine.out","w",stdout); 
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&b[i]);
	memset(a,0,sizeof(a));
	dfs(1,1);
	memset(a,0,sizeof(a));
	dfs(1,0);
	printf("%d\n",ans);
	return 0;
}


——渐霜风凄惨,关河冷落,残照当楼。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值