HDU-1010-Tempter of the Bone

HDU-1010-Tempter of the Bone

http://acm.hdu.edu.cn/showproblem.php?pid=1010

给这题折腾了半天啊,刚开始用BFS写的,总是WA,后来发现这题要求在给定的时间点到达,不能早,也不能迟,而BFS每次求出的是最短时间,不合题意,于是转用DFS,剪枝的方法是参考HDU的PPT写的,居然还要考虑奇偶性

可以把map看成这样:

0 1 0 1 0 1

1 0 1 0 1 0

0 1 0 1 0 1

1 0 1 0 1 0

0 1 0 1 0 1

从为 0 的格子走一步,必然走向为 1 的格子

从为 1 的格子走一步,必然走向为 0 的格子

0 ->1或1->0 必然是奇数步

0->0 走1->1 必然是偶数步

所以:当遇到从 0 走向 0 但是要求时间是奇数的,或者从1 走向 0 但是要求时间是偶数的 都可以直接判断不可达

附一个测试数据

4 4 9

S..X

X.X.

..XD

....

YES

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
char map[10][10];
int n,m,t;
int xx,yy;
int flag;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int go(int x,int y)
{
	if(0<=x&&x<n&&0<=y&&y<m)
	return 1;
	return 0;
}
void dfs(int x,int y,int cnt)
{
	int i,min;
    if(cnt==t&&x==xx&&y==yy)
	flag=1;
    if(flag)
	return;
	min=abs(x-xx)+abs(y-yy);
	if(min>t-cnt)    //到目的地的最短时间比所剩时间大
	return;
	if(cnt>t)
	return;
	if(min%2!=(t-cnt)%2)  //奇偶性不同
	return;
	for(i=0;i<4;i++)
	{
		if(go(x+dir[i][0],y+dir[i][1])&&map[x+dir[i][0]][y+dir[i][1]]!='X')
		{
			map[x+dir[i][0]][y+dir[i][1]]='X';
			dfs(x+dir[i][0],y+dir[i][1],cnt+1);
            map[x+dir[i][0]][y+dir[i][1]]='.';
		}
	}
	return;
}
int main()
{
	int i,j,wall;
	int x,y;
	while(scanf("%d%d%d",&n,&m,&t),n||m||t)
	{
		for(i=0;i<n;i++)
		scanf("%s",map[i]);
		wall=0;
		for(i=0;i<n;i++)
		for(j=0;j<m;j++)
		{
			if(map[i][j]=='S')
			{
				x=i;
				y=j;
			}
			else if(map[i][j]=='D')
			{
				xx=i;
				yy=j;
			}
			else if(map[i][j]=='X')
			wall++;
		}
		if(n*m-wall<=t)  //可走的路小于时间
		{
			printf("NO\n");
			continue;
		}
		map[x][y]='X';
		flag=0;
		dfs(x,y,0);
    	if(flag==1)		
		printf("YES\n");
		else
		printf("NO\n");
	}
	return 0;
}



你可能感兴趣的:(测试,ini,Go)