1. 程式人生 > >HUST第八屆程式設計競賽-G小樂樂打遊戲(雙bfs)

HUST第八屆程式設計競賽-G小樂樂打遊戲(雙bfs)

題目描述 

        小樂樂覺得學習太簡單了,剩下那麼多的時間好無聊,於是便想打遊戲。
        最近新出了一個特別火的遊戲,叫吃豬,小樂樂準備玩一玩。
        吃豬遊戲很簡單,給定一個地圖,大小為n*m,在地圖中會隨機出現一個火山口,只要小樂樂能逃離這個地圖,他便能吃豬! 
        但吃雞遠沒有那麼簡單:
        1.小樂樂每走一次只能上下左右四個方向中走一步。
        2.小樂樂每走一步,火山噴發的岩漿就會向四周蔓延一個格子,所有岩漿走過的地方都視為被岩漿覆蓋。
        3.小樂樂碰到岩漿就會死。
        4.地圖中還有很多障礙,使得小樂樂不能到達,但是岩漿卻可以把障礙融化。
        5.小樂樂只有走到題目給定的終點才算遊戲勝利,才能吃豬。
        小樂樂哪見過這場面,當場就蒙了,就想請幫幫他,告訴他是否能吃豬。

輸入描述:

多組樣例輸入

第一行給定n,m,(1 <= n, m <= 1000)代表地圖的大小。

接下來n行,每一行m個字元,代表地圖,對於每一個字元,如果是'.',代表是平地,'S'代表小樂樂起始的位置,
'E'代表終點,'#'代表障礙物,'F'代表火山口。

輸出描述:

輸出只有一行。如果小樂樂能吃豬,輸出"PIG PIG PIG!"。否則輸出"A! WO SI LA!"。

輸入

3 3
F..
#S#
#.E

輸出

PIG PIG PIG!

思路:主要是注意火山如何處理,這個題用dfs顯然很麻煩,因為要處理火山岩漿,岩漿每走一步擴散四邊(四周),所以用bfs更好處理。岩漿先走,這樣人就不能走岩漿走過的地方。岩漿走過的地方標記成2,便於岩漿廣搜。
處理的時候,要一步處理一步的,不能直接塞到佇列裡迴圈。所以要記一下下一步要處理多少位置(新佇列元素)。
坑點:
1.四周是上下左右,而不是八個方向。
2.輸入的時候注意,一行行輸入即可。

 1 //注意火山先走,這樣便於判斷會不會被燙死 
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue> 
 5 using namespace std;
 6 
 7 struct node{
 8     int x,y;
 9 };
10 
11 char map[1005][1005];
12 int mark[1005][1005];
13 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 
14 int n,m,xf,yf,xs,ys,xe,ye;
15 int flag; 16 17 void bfs(){ 18 queue<node>q; 19 queue<node>p; 20 node head1,next1,head2,next2; 21 head1.x=xs,head1.y=ys; 22 q.push(head1); 23 head2.x=xf,head2.y=yf; 24 p.push(head2); 25 int num1=1,num2=1; 26 27 while(!q.empty()&&!p.empty()){ 28 29 int t2=0; 30 while(num2--){//岩漿 31 head2=p.front(); 32 p.pop(); 33 for(int i=0;i<4;i++){ 34 int xx=head2.x+dir[i][0]; 35 int yy=head2.y+dir[i][1]; 36 if(xx<0||yy<0||xx>=n||yy>=m||mark[xx][yy]==2)continue; 37 mark[xx][yy]=2; 38 t2++; 39 next2.x=xx,next2.y=yy; 40 p.push(next2); 41 } 42 } 43 num2=t2; 44 45 46 int t1=0; 47 while(num1--){//人 48 head1=q.front(); 49 q.pop(); 50 for(int i=0;i<4;i++){ 51 int xx=head1.x+dir[i][0]; 52 int yy=head1.y+dir[i][1]; 53 if(xx==xe&&yy==ye&&mark[xx][yy]==0){ 54 flag=1; 55 return ; 56 } 57 if(xx<0||yy<0||xx>=n||yy>=m||mark[xx][yy]||map[xx][yy]=='#') continue; 58 t1++; 59 mark[xx][yy]=1; 60 next1.x=xx,next1.y=yy; 61 q.push(next1); 62 } 63 } 64 num1=t1; 65 } 66 } 67 68 int main(){ 69 while(~scanf("%d%d",&n,&m)){ 70 71 for(int i=0;i<n;i++){ 72 scanf("%s",map[i]); 73 for(int j=0;j<m;j++){ 74 if(map[i][j]=='F') xf=i,yf=j; 75 if(map[i][j]=='S') xs=i,ys=j; 76 if(map[i][j]=='E') xe=i,ye=j; 77 } 78 } 79 memset(mark,0,sizeof(mark)); 80 mark[xf][yf]=2; 81 mark[xs][ys]=1; 82 flag=0; 83 bfs(); 84 85 if(flag) printf("PIG PIG PIG!\n"); 86 else printf("A! WO SI LA!\n"); 87 88 } 89 return 0; 90 }