hdu1010——Tempter of the Bone
  1b1UkOTfE3rN 2023年11月02日 118 0


Tempter of the Bone


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 72102    Accepted Submission(s): 19839



Problem Description


The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze.

The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.


 



Input


The input consists of multiple test cases. The first line of each test case contains three integers N, M, and T (1 < N, M < 7; 0 < T < 50), which denote the sizes of the maze and the time at which the door will open, respectively. The next N lines give the maze layout, with each line containing M characters. A character is one of the following:

'X': a block of wall, which the doggie cannot enter;
'S': the start point of the doggie;
'D': the Door; or
'.': an empty block.

The input is terminated with three 0's. This test case is not to be processed.


 



Output


For each test case, print in one line "YES" if the doggie can survive, or "NO" otherwise.


 



Sample Input


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

 



Sample Output


NO YES


 



Author


ZHANG, Zheng


 



Source


ZJCPC2004


 



Recommend


JGShining   |   We have carefully selected several similar problems for you:   1016  1242  1072  1175  1015


普通搜索不行,需要奇偶剪枝,奇偶剪枝的意思是如果当前点到目标点的最少步数的奇偶性和剩余时间的奇偶性不同就直接return,因为奇数步需要奇数时间,偶数步需要偶数时间

#include<map>
#include<set>
#include<list>
#include<stack>
#include<queue>
#include<vector>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

int dir[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
bool vis[10][10];
char mat[10][10];
int n, m, t;
int sx, sy, ex, ey;
bool flag;

bool is_legal(int x, int y)
{
	if(x < 0 || x >= n || y < 0 || y >= m || mat[x][y] == 'X')
		return false;
	return true;
}

void dfs(int x, int y, int step)
{
	if(flag)
		return;
	if(t - step < (abs(x - ex) + abs(y - ey)))
		return;
	if((abs(x - ex) + abs(y - ey)) % 2 != (t - step) % 2)
		return ;
	if(mat[x][y] == 'D')
	{
		if(step == t)
			flag = true;
		return;
	}
	for(int i = 0; i < 4; i++)
	{
		int xx = x + dir[i][0];
		int yy = y + dir[i][1];
		if( !is_legal(xx, yy) )
			continue;
		if(vis[xx][yy])
			continue;
		vis[xx][yy] = 1;
		dfs(xx, yy, step + 1);
		vis[xx][yy] = 0;
	}
}

int main()
{
	while(~scanf("%d%d%d", &n, &m, &t))
	{
		if( !t && !n && !m)
			break;
		int wall = 0;
		for(int i = 0; i < n; i++)
		{
			scanf("%s", mat[i]);
			for(int j = 0; j < m; j++)
			{
				if(mat[i][j] == 'S')
				{
					sx = i;
					sy = j;
				}
				if(mat[i][j] == 'D')
				{
					ex = i;
					ey = j;
				}
				if(mat[i][j] == 'X')
				{
					wall ++;
				}
			}
		}
		if(n * m - wall < t)
		{
			printf("NO\n");
			continue;
		}
		int s = sx * n + sy;
		int e = ex * n + ey;
		//printf("%d %d %d %d\n", sx, sy, ex, ey);
		memset( vis, 0, sizeof(vis) );
		vis[sx][sy] = 1;
		flag = false;
		dfs(sx, sy, 0);
		if(flag)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}




【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  ehrZuhofWJiC   2024年04月26日   42   0   0 日志Java
  Fo7woytj0C0D   2023年12月23日   31   0   0 pythonsedidepythonidesed
1b1UkOTfE3rN