1. 程式人生 > >TOJ 1005 Hero In Maze(BFS)

TOJ 1005 Hero In Maze(BFS)

-s 需要 sca main mce map 時間段 || times

描述

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\n"); 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\n"); 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)