1. 程式人生 > 其它 >紅與黑(bfs 連通塊)

紅與黑(bfs 連通塊)

技術標籤:演算法搜尋演算法演算法資料結構

紅與黑

題目連結
有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。
你站在其中一塊黑色的瓷磚上,只能向相鄰(上下左右四個方向)的黑色瓷磚移動。
請寫一個程式,計算你總共能夠到達多少塊黑色的瓷磚。

輸入格式

輸入包括多個數據集合。
每個資料集合的第一行是兩個整數 W 和 H,分別表示 x 方向和 y 方向瓷磚的數量。
在接下來的 H 行中,每行包括 W 個字元。每個字元表示一塊瓷磚的顏色,規則如下
1)‘.’:黑色的瓷磚;
2)‘#’:紅色的瓷磚;
3)‘@’:黑色的瓷磚,並且你站在這塊瓷磚上。該字元在每個資料集合中唯一出現一次。
當在一行中讀入的是兩個零時,表示輸入結束。

輸出格式

對每個資料集合,分別輸出一行,顯示你從初始位置出發能到達的瓷磚數(記數時包括初始位置的瓷磚)。

資料範圍

1≤W,H≤20
輸入樣例:
6 9
…#.
…#





#@…#
.#…#.
0 0

輸出樣例:

45

演算法分析

我們可以用bfs來尋找連通塊,bfs需要用到佇列,如果是隻有,橫縱座標的資訊的話,用pair來儲存是很方便的,這題的輸入,行和列是反著的.然後就是bfs的模板了.

程式碼實現

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<math.h> using namespace std; typedef pair<int,int > PII; const int maxn=25; char map[maxn][maxn]; int w,h; int dx[]={0,1,0,-1},dy[]={-1,0,1,0}; queue<PII> q; bool pd(int x,int y) { if(x<0||x>=h||y<0||y>=w||map[x][y]!='.') return false; else return true; } int main
() { while(cin>>w>>h,w||h) { int sx,sy; for(int i=0;i<h;i++) { for(int j=0;j<w;j++) { cin>>map[i][j]; if(map[i][j]=='@') { sx=i; sy=j; } } } int cnt=0; q.push({sx,sy}); map[sx][sy]='#'; while(!q.empty()) { PII p=q.front(); q.pop(); cnt++; for(int i=0;i<4;i++) { int nx=p.first+dx[i]; int ny=p.second+dy[i]; if(pd(nx,ny)) { q.push({nx,ny}); map[nx][ny]='#'; } } } cout<<cnt<<endl; } }