1006: Hero In Maze
1006: Hero In Maze
时间限制: 1000 Sec 内存限制: 64 MB提交: 417 解决: 80
[提交][状态][讨论版][命题人:外部导入]
题目描述
500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。
突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持T天,他急忙赶到迷宫,开始到处寻找公主的下落。 时间一点一点的过去,Jesse还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此Jesse郁郁寡欢,茶饭不思,一年后追随公主而去了。T_T 500年后的今天,Jesse托梦给你,希望你帮他判断一下当年他是否有机会在给定的时间内找到公主。
他会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能救出心爱的公主。
输入
题目包括多组测试数据。 每组测试数据以三个整数N,M,T(0<n, m≤20, t>0)开头,分别代表迷宫的长和高,以及公主能坚持的天数。 紧接着有M行,N列字符,由".","*","P","S"组成。其中 "." 代表能够行走的空地。 "*" 代表墙壁,Jesse不能从此通过。 "P" 是公主所在的位置。 "S" 是Jesse的起始位置。 每个时间段里Jesse只能选择“上、下、左、右”任意一方向走一步。 输入以0 0 0结束。
输出
如果能在规定时间内救出公主输出“YES”,否则输出“NO”。
样例输入
4 4 10
....
....
....
S**P
0 0 0
样例输出
YES
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; char maze[25][25]; int vis[25][25]; int dir[4][2] = {{1,0}, {-1,0},{0,1},{0,-1}}; int n, ans, num, m, c, d; struct point { int x; int y; int step; }; int bfs(int x, int y) { queue<point> p; struct point now, t, start; start.x = x; start.y = y; start.step = 0; vis[x][y] = 1; p.push(start); while(!p.empty()) { int i, a, b; t = p.front(); if(t.x == c && t.y == d) { while(!p.empty()) p.pop(); return t.step; } for(i = 0; i < 4; ++i) { a = t.x + dir[i][0]; b = t.y + dir[i][1]; if(a >= 1 && a <= m && b >= 1 && b <= n && vis[a][b] == 0) { vis[a][b] = 1; now.step = t.step + 1; now.x = a; now.y = b; p.push(now); } } p.pop(); } while(!p.empty()) p.pop(); return 1000000000; } int main() { while(~scanf("%d%d%d", &n, &m, &num)) { if(n == 0 && m == 0 && num == 0) break; int i, j, a, b; memset(maze, 0, sizeof(maze)); memset(vis, 0, sizeof(vis)); for(i = 1; i <= m; ++i) { getchar(); //!!!!!! for(j = 1; j <= n; ++j) { scanf("%c", &maze[i][j]); if(maze[i][j] == 'S') { a = i; b = j; } else if(maze[i][j] == 'P') { c = i; d = j; } else if(maze[i][j] == '*') vis[i][j] = 1; } } ans = bfs(a, b); if(ans > num) printf("NO\n"); else printf("YES\n"); } return 0; }