Tempter of the Bone —HDU1010(DFS+剪枝)

Tempter of the Bone

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 102071    Accepted Submission(s): 27649

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

————————————————————————————————————————————————————————————————————————————

题目的意思是从地图的S点搜到D点,‘.’为路‘X’为墙,问能否正好在t秒时到达终点。

处理方法是直接DFS搜索,加上剪枝。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
char map[9][9];
int m, n, t;
int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
bool escape;
void dfs(int si, int sj, int di, int dj, int cnt)
{
	if (si <= 0 || sj <= 0 || si > m || sj > n)
		return;
	if (si == di&&sj == dj&&cnt == t)
	{
		escape = 1;
		return;
	}
	int temp = t - cnt - abs(si - di) - abs(sj - dj);
	if (temp < 0 || temp % 2)//奇偶剪枝

		return;
	for (int i = 0; i < 4; i++)
	{
		if (map[si + dir[i][0]][sj + dir[i][1]] != 'X')
		{
			map[si + dir[i][0]][sj + dir[i][1]] = 'X';
			dfs(si + dir[i][0], sj + dir[i][1], di, dj, cnt + 1);
			if (escape)
				return;
			map[si + dir[i][0]][sj + dir[i][1]] = '.';
		}
	}
	return;
}
int main()
{
	int i, j, si, sj, di, dj, wall;
	while (cin >> m >> n >> t)
	{
		if (!m && !n && !t)
		{
			break;
		}
		wall = 0;
		for (i = 1; i <= m; i++)
		{
			for (j = 1; j <= n; j++)
			{
				cin >> map[i][j];
				if (map[i][j] == 'S')
				{
					si = i;
					sj = j;
				}
				else if (map[i][j] == 'D')
				{
					di = i;
					dj = j;
				}
				else if (map[i][j] == 'X')
					wall++;
			}
		}
		if (n*m<t + wall)//若路的数量小于时间t,就一定不可能。
		{
			cout << "NO" << endl;
			continue;
		}
		escape = 0;
		map[si][sj] = 'X';
		dfs(si, sj, di, dj, 0);
		if (escape)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;

	}
	return 0;

}
时间: 2024-10-04 07:43:01

Tempter of the Bone —HDU1010(DFS+剪枝)的相关文章

hdu 1010 Tempter of the Bone (DFS+剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 68206    Accepted Submission(s): 18719 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

【HDU - 1010】Tempter of the Bone(dfs+剪枝)

Tempter of the Bone 直接上中文了 Descriptions: 暑假的时候,小明和朋友去迷宫中寻宝.然而,当他拿到宝贝时,迷宫开始剧烈震动,他感到地面正在下沉,他们意识到这是一个陷阱!他们想尽一切办法逃出去.迷宫是一个大小为 N*M 的长方形,迷宫中有一扇门.一开始,门是关着的,他会在第 t 秒的时间打开.因为,小明和朋友必须在第 t 秒到大门口.每一秒,他都可以向上下左右四个方向移动一个点.一旦他移动了,他刚才所在的点就消失,(这意味着他不能回到他已经走过的点).他不能在一个

HDU1010 --- Tempter of the Bone(dfs+剪枝)

小明做了一个很久很久的梦,醒来后他竟发现自己和朋友在一个摇摇欲坠的大棋盘上,他们必须得想尽一切办法逃离这里.经过长时间的打探,小明发现,自己所在的棋盘格子上有个机关,上面写着“你只有一次机会,出发后t秒大门会为你敞开”,而他自己所在的棋盘是大小为 N*M 的长方形,他可以向上下左右四个方向移动(不可走有障碍点).棋盘中有一扇门.根据机关的提示,小明顿时明白了,他和朋友必须在第 t 秒到门口.而这一切,没有回头路!因为一旦他移动了,他刚才所在的点就会消失,并且他不能在一个点上停留超过一秒,不然格子

HDU1010 Tempter of the Bone 【DFS】+【剪枝】

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 70895    Accepted Submission(s): 19535 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU 1010 Tempter of the Bone(DFS+奇偶性剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 70665    Accepted Submission(s): 19487 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU 1010 Tempter of the Bone【DFS经典题+奇偶剪枝详解】

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 125945    Accepted Submission(s): 33969 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

hdoj 1010 Tempter of the Bone【dfs查找能否在规定步数时从起点到达终点】【奇偶剪枝】

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 89317    Accepted Submission(s): 24279 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU1010 DFS+剪枝

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 110290    Accepted Submission(s): 29967 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

杭电1010--Tempter of the Bone(Dfs+剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 90751    Accepted Submission(s): 24692 Problem Description The doggie found a bone in an ancient maze, which fascinated him a