#include<iostream> #include<cmath> #include<cstring> #include<cstdio> using namespace std; int n,m,dx[100],dy[100],q[400][2501]; int front =1,rear=1; bool a[10000][1000]; char c; int j,i,sum=0,ans=0,s,x,y,k; int main() { cin>>n>>m; for(i=1;i<m+1;i++) { for(j=1;j<n+1;j++) { cin>>c; if(c=='.')a[i][j]=true; else if(c=='@') { x=i;y=j; a[i][j]=false; } } scanf("*"); } dx[1]=1;dx[2]=-1;dx[3]=0;dx[4]=0; dy[1]=0;dy[2]=0;dy[3]=1;dy[4]=-1; q[1][1]=x;q[2][1]=y; front =1,rear=1; while(front<=rear) { for(int i=1;i<=4;i++) { x=q[1][front]+dx[i]; y=q[2][front]+dy[i]; if(a[x][y]){ rear++; q[1][rear]=x; q[2][rear]=y; a[x][y]=false; } } front++; } printf("%d\n",rear); return 0; 先放一個寬度優先搜索的代碼!
試題描述:
在一個W*h的矩形廣場上,每一塊1*1的地面都鋪設了紅色或黑色瓷磚。小林同學站在某一塊黑色瓷磚上,他可以從此處出發,移動到上下左右四個相鄰的且是黑色的瓷磚上。現在他想知道,通過重復上述移動所能經過的黑色瓷磚數。
輸入:
第一行為h、w,2<=w、h<=50,之間有一個空格隔開。
以下為一個w行h列的二維字符矩陣,每個字符為“.”“#”“@”分別表示該位置為黑色瓷磚、紅色瓷磚、小林初始位置。
輸出:
輸出一行一個整數,表示小林從出發位置可以經過的黑色瓷磚數量。
輸入實例:
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
輸出實例:
59
本題是一道“聯通塊問題”;
代碼也是很容易理解的,用一個寬度優先搜索,從上下左右四個方向進行對黑色瓷磚的判斷,同時用一個bool類型的數組記錄,使其不走重復的路;
不要忘記用二維數組!!!