TOJ 1005 Hero In Maze(BFS)
Posted xmmq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TOJ 1005 Hero In Maze(BFS)相关的知识,希望对你有一定的参考价值。
描述
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
题意
广度优先搜索bfs,如果到达天数>=所剩时间T 输出YES ,如果无法到达||可以到达但是到达天数<所剩天数则输出NO
题解
直接跑bfs,需要注意的是行列的输入以及如果跑不到终点的样例,所以输出NO要放在while外面。
代码
1 #include"stdio.h" 2 #include"queue" 3 #include"string.h" 4 using namespace std; 5 int n,m,t,sx,sy,px,py,f; 6 char map[25][25]; 7 int check[25][25]; 8 int dx[]={0,0,1,-1}; 9 int dy[]={1,-1,0,0}; 10 struct node 11 { 12 int x,y,t; 13 }; 14 void bfs() 15 { 16 int i; 17 queue<node> qu; 18 node a,b; 19 a.x=sx,a.y=sy,a.t=0; 20 qu.push(a); 21 check[sx][sy]=1; 22 while(!qu.empty()) 23 { 24 a=qu.front(); 25 qu.pop(); 26 if(a.x==px&&a.y==py&&a.t<=t) 27 { 28 printf("YES "); 29 f=0; 30 break; 31 } 32 for(i=0;i<4;i++) 33 { 34 b=a; 35 b.x+=dx[i]; 36 b.y+=dy[i]; 37 if(map[b.x][b.y]==‘*‘) 38 continue; 39 if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&check[b.x][b.y]==0) 40 { 41 b.t++; 42 check[b.x][b.y]=1; 43 qu.push(b); 44 } 45 } 46 } 47 if(f) 48 printf("NO "); 49 } 50 int main() 51 { 52 int i,j; 53 while(scanf("%d %d %d",&m,&n,&t),n+m+t) 54 { 55 f=1; 56 memset(check,0,sizeof check); 57 for(i=0;i<n;i++) 58 scanf("%s",map[i]); 59 for(i=0;i<n;i++) 60 for(j=0;j<m;j++) 61 { 62 if(map[i][j]==‘S‘){sx=i,sy=j;} 63 if(map[i][j]==‘P‘){px=i,py=j;} 64 } 65 bfs(); 66 } 67 return 0; 68 }
以上是关于TOJ 1005 Hero In Maze(BFS)的主要内容,如果未能解决你的问题,请参考以下文章