HDU 1010 Tempter of the Bone (DFS)

因为要求不是最快到达,而是在T时刻正好到达,所以不能用BFS搜。DFS注意剪枝,如果剩余时间和剩余步数奇偶性不同的话要减掉。

//Memory: 232 KB		
//Time: 687 MS
#include <stdio.h>
#include <string.h>
#include <math.h>
char map[10][10];
bool vis[10][10];
int dx,dy,n,m,time;
int d[4][2]={1,0,0,1,-1,0,0,-1};
bool flag;
void dfs(int x,int y,int t)
{
	if((x+y+dx+dy)%2 != t%2)
		return;
	if(t==0)
		return;
	if(flag)
		return;
	vis[x][y]=true;
	int k=0,xt,yt;
	for(k=0;k<4;k++)
	{
		xt=x+d[k][0];
		yt=y+d[k][1];
		if(xt>=1 && xt<=n && yt>=1 && yt<=m )
			if(map[xt][yt]!='X' && !vis[xt][yt])
			{
				if(dx==xt && dy==yt && t==1)
					flag=true;
				else
				{
					dfs(xt,yt,t-1);
				}
				if(flag)
					return;
			}
	}
	vis[x][y]=false;
}
int main()
{
	while(scanf("%d%d%d",&n,&m,&time)!=EOF)
	{
		if(n==0 && m==0 && time==0)
			break;
		flag=false;
		memset(vis,false,sizeof(vis));
		int i,j;
		int st,sy;
		getchar();
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				scanf("%c",&map[i][j]);
				if(map[i][j]=='S')
				{st=i;sy=j;}
				if(map[i][j]=='D')
				{dx=i;dy=j;}
			}
			getchar();
		}
		dfs(st,sy,time);
		if(flag)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}


你可能感兴趣的:(HDU 1010 Tempter of the Bone (DFS))