ZOJ2110Tempter of the Bone(DFS模板题,迷宫问题)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2110

题意:

一只小狗在一个古老的迷宫里找到一根骨头,当它叼起骨头时,迷宫开始颤抖,它感觉到地 面开始下沉。它才明白骨头是一个陷阱,它拼命地试着逃出迷宫。

 迷宫是一个 N×M大小的长方形,迷宫有一个门。刚开始门是关着的,并且这个门会在第 T秒 钟开启,门只会开启很短的时间(少于一秒),因此小狗必须恰好在第 T秒达到门的位置。每秒钟, 它可以向上、下、左或右移动一步到相邻的方格中。但一旦它移动到相邻的方格,这个方格开始 下沉,而且会在下一秒消失。所以,它不能在一个方格中停留超过一秒,也不能回到经过的方格。

题解:

这里的时间相当于递归深度。DFS。


代码:

<span style="font-size:14px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAX=10;
char g[MAX][MAX];
int n,m,t;
int sx,sy,ex,ey;
int dirx[4]={0,1,0,-1};
int diry[4]={1,0,-1,0};
int escape;
bool judgein(int x,int y)
{
	return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y,int step)
{
	if(step==t&&x==ex&&y==ey)
	{
		escape=1;
		return ;
	}
	int tmp=(t-step)-(fabs(x-ex)+fabs(y-ey));//剪枝
	if(tmp<0||tmp%2) return ;
	for(int i=0;i<4;i++)
	{
		int nx=x+dirx[i];
		int ny=y+diry[i];
		if(judgein(nx,ny)&&g[nx][ny]!='X')
		{
			g[nx][ny]='X';
			dfs(nx,ny,step+1);
			if(escape) return ;
			g[nx][ny]='.';
		}
	}
	return;
}
int main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	while(scanf("%d%d%d",&n,&m,&t))
	{
		escape=0;
		if(n==0&&m==0&&t==0) break;
		for(int i=0;i<n;i++)
		{
			getchar();
			for(int j=0;j<m;j++)
			{
				scanf("%c",&g[i][j]);
				if(g[i][j]=='S')
				{
					sx=i;
					sy=j;
				}
				else if(g[i][j]=='D')
				{
					ex=i;
					ey=j;
				}
			}
		}
		getchar();
	//	printf("%d %d %d %d\n",sx,sy,ex,ey);
		g[sx][sy]='X';
		dfs(sx,sy,0);
		printf("%s\n",escape?"YES":"NO");
	}
	return 0;
}</span>


你可能感兴趣的:(DFS)