hdu 1010 Tempter of the Bone

本文深入解析了HDOJ Tempter of the Bone的算法实现,采用深度优先搜索(DFS)解决狗在特定条件下的迷宫逃脱问题。通过奇偶剪枝与额外剪枝策略,优化了解决方案。文章详细阐述了问题分析、剪枝技巧及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hdu   1010   Tempter of the Bone          题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

                                                              

DFS

题目大意:狗走迷宫,给出地图,地图有四种标记,分别是'X'--墙;'.'--平地;'S'--起始点;'D'--终止点。终止点door是个门,在t时刻打开,狗在t时刻到达D点,它就出去了,问狗有没有出去的可能。

题目分析:DFS,简单易懂。需要考虑的地方主要在剪枝,本题我用了两种剪枝,具体看代码。

code:

#include<stdio.h>
#include<string.h>
#include<math.h>
int t,m,n,flag,sx,sy,ex,ey;
char c[8][8];
int abs(int a)
{
	if(a>0)return a;
	else return a*(-1);
}
void dfs(int x,int y,int step)
{
	if(flag)return;
	//printf("现在在:c[%d][%d]\n",x,y);
	if(x==ex&&y==ey&&step!=t)return;
	if(x==ex&&y==ey&&step==t){flag=1;return;}
	if(t-step<abs(ex-x)+abs(ey-y)||step==t)return;
	c[x][y]='X';
	if(x+1<m&&(c[x+1][y]=='.'||c[x+1][y]=='D'))dfs(x+1,y,step+1),c[x+1][y]='.';
	if(x-1>=0&&(c[x-1][y]=='.'||c[x-1][y]=='D'))dfs(x-1,y,step+1),c[x-1][y]='.';
	if(y+1<n&&(c[x][y+1]=='.'||c[x][y+1]=='D'))dfs(x,y+1,step+1),c[x][y+1]='.';
	if(y-1>=0&&(c[x][y-1]=='.'||c[x][y-1]=='D'))dfs(x,y-1,step+1),c[x][y-1]='.';
	return;
}
int main()
{
	int i,j,step,wall;
	char str[10];
	while(scanf("%d%d%d",&m,&n,&t)!=EOF&&(m||n||t))
	{
		wall=flag=0;
		getchar();
		for(i=0;i<m;i++)
		{
			scanf("%s",str);
			for(j=0;j<n;j++)
			{
				if(str[j]=='X')wall++;
				c[i][j]=str[j];
				if(c[i][j]=='S')sx=i,sy=j;
				else if(c[i][j]=='D')ex=i,ey=j;
			}
		}
		//printf("奇偶剪枝标志:%s\n",(t-abs(ex-sx)+abs(ey-sy))%2?"剪":"不剪");
		if(!((t-abs(ex-sx)+abs(ey-sy))%2)&&n*m-wall-1>=t)
		{
			dfs(sx,sy,0);
			if(flag)printf("YES\n");
			else printf("NO\n");
		}//如果说所有的可以走的路加起来都比要求的时间小的话,那么肯定到不了了
		else printf("NO\n");
	}
	return 0;
} 
//这个题可以:1不用visit数组,2需要奇偶剪枝,3还有最后这种奇葩剪枝。 


PS:又是大半天……(原创第100篇,纪念一下)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值