紅與黑(bfs 連通塊)
阿新 • • 發佈:2021-02-03
紅與黑
題目連結
有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。
你站在其中一塊黑色的瓷磚上,只能向相鄰(上下左右四個方向)的黑色瓷磚移動。
請寫一個程式,計算你總共能夠到達多少塊黑色的瓷磚。
輸入格式
輸入包括多個數據集合。
每個資料集合的第一行是兩個整數 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;
}
}