hdu1010 Tempter of the Bone

方法:dfs

思想:由于本题中规定只有在固定时刻到达目的点才能逃脱,

不能提早,更不能延迟,故不能用bfs。可以用dfs找出所有情况,

若有可行解,直接返回即可。本题比较郁闷的是,在tzc上将方向

数组int dir[4][2]稍微变动两下,就会超时。这也是今后出现TLE时

该考虑的重要的一点吧,可以作为经验教训。

#include<stdio.h>
#include<math.h>
char map[11][11];
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
int t;
int flag;
int n,m;
int dx,dy;
void dfs(int i,int j,int step)
{
	int x,y;
    if(i==dx&&j==dy&&step==t)
		flag=1;
	if(step>t)
		return;
	if(flag)
		return;
	if((t-step)%2!=(abs(dx-i)+abs(dy-j))%2)//如果奇偶性不同就返回
		return;
	for(int u=0;u<4;u++)
	{
        x=i+dir[u][0];
		y=j+dir[u][1];
		if(x>=0&&y>=0&&x<n&&y<m)
		{
			if(map[x][y]!='X')
			{
				map[x][y]='X';
				dfs(x,y,step+1);
				map[x][y]='.';
			}
		}
	}	
}
int main()
{
	
	int i,j,x,y,k;
	while(scanf("%d%d%d",&n,&m,&t)!=-1)
	{
		k=0;
		if(n==0&&m==0&&t==0)
			break;
		getchar();
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				scanf("%c",&map[i][j]);
				if(map[i][j]=='S')
				{
					x=i;
					y=j;
					map[i][j]='X';
				}
				if(map[i][j]=='D')
				{
					dx=i;
					dy=j;k++;
				}
				if(map[i][j]=='.')
					k++;
			}
			getchar();
		}
		if(k<t)
		{
			printf("NO\n");continue;
		}
	    flag=0;
		dfs(x,y,0);
		if(flag)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

/*
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0
*/

 

posted @ 2013-07-13 09:16  zlyblog  阅读(201)  评论(0编辑  收藏  举报