標籤:bsp 結束 沒有 重複 cin pen 表示 span bfs
題3 入門
【問題描述】
不是任何人都可以進入桃花島的,黃藥師最討厭象郭靖一樣獃頭獃腦的人。所以,他在桃花島的唯一入口處修了一條小路,這條小路全部用正方形瓷磚鋪設而成。有的瓷磚可以踩,我們認為是安全的,而有的瓷磚一踩上去就會有噴出要命的毒氣,那你就死翹翹了,我們認為是不安全的。你只能從一塊安全的瓷磚上走到與他相鄰的四塊瓷磚中的任何一個上,但它也必須是安全的才行。
由於你是黃蓉的朋友,她事先告訴你哪些磚是安全的、哪些磚是不安全的,並且她會指引你飛到第1塊磚上(第1塊磚可能在任意安全位元置),現在她告訴你進入桃花島的秘密就是:如果你能走過最多的瓷磚並且沒有死,那麼桃花島的大門就會自動開啟了,你就可以從當前位置直接飛進大門了。
注意:瓷磚可以重複走過,但不能重複計數。
【輸入格式】
第1行兩個正整數W和H,分別表示小路的寬度W和長度H,W和H都不大於20。
以下H行為一個H*W的字元矩陣。每一個字元代表一塊瓷磚。其中,“.”代表安全的磚,“#”代表不安全的磚,“@”代表第1塊磚。
【輸出格式】
輸出一行,只包括一個數,即你從第1塊磚開始所能安全走過的最多的磚塊個數(包括第1塊磚)。
【範例輸入】
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#[email protected]#.#.
.#.#####.#.
.#.......#.
.#########.
...........
【範例輸出】
59
最近在準備複賽,做到了這道題,一開始沒有注意可以重複走然後WA了
這題用了隊列的思想,開始的點先入隊列,然後四個方向尋找是否符合條件,如果符合條件就入隊列,然後原始的點出隊列,直到隊列為空白結束
代碼:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int w,h,head=0,tail=1,sx,sy,d[4][2]={{-1,0},{0,-1},{0,1},{1,0}},dx,dy,maxx=0; 4 char g[21][21]; 5 bool used[21][21]; 6 struct Node 7 { 8 int x; 9 int y;10 }q[1001];11 void bfs(int a,int b)12 {13 q[tail].x=a;14 q[tail].y=b;15 while(head<tail)16 {17 head++;18 for(int i=0;i<4;i++)19 {20 dx=q[head].x+d[i][0];21 dy=q[head].y+d[i][1];22 if(used[dx][dy]==0&&dx>0&&dy>0&&dx<=h&&dy<=w)23 {24 tail++;25 q[tail].x=dx;26 q[tail].y=dy;27 used[dx][dy]=1;28 }29 }30 }31 return ;32 }33 int main()34 {35 //freopen("door.in","r",stdin);36 //freopen("door.out","w",stdout);37 cin>>w>>h;38 for(int i=1;i<=h;i++)39 {40 for(int j=1;j<=w;j++)41 {42 cin>>g[i][j];43 if(g[i][j]==‘#‘)44 {45 used[i][j]=1;46 }47 else if(g[i][j]==‘.‘)48 {49 used[i][j]=0;50 }51 else52 {53 used[i][j]=0;54 sx=i;55 sy=j;56 }57 }58 }59 bfs(sx,sy);60 cout<<tail-1<<endl;61 return 0;62 }View Code
入門-BFS解法