题目描述
小白和他的朋友周末相约去召唤师峡谷踏青。他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地。草丛通过上下左右 4 个方向扩展其他草丛形成一片草地,任何一片草地中的格子都是草丛,并且所有格子之间都能通过上下左右连通。如果用’#‘代表草丛,’.'代表空地,下面的峡谷中有 2 片草地。
##…
…##
处在同一个草地的 2 个人可以相互看到,空地看不到草地里面的人。他们发现有一个朋友不见了,现在需要分头去找,每个人负责一片草地,想知道他们至少需要多少人。
输入
第一行输入 n, m (1 ≤ n,m ≤ 100) 表示峡谷大小。
接下来输入 n 行字符串表示峡谷的地形。
输出
输出至少需要多少人。
样例
输入
5 6
.#…
…#…
…#…#
…##.
.#…
输出
5
思路
用二维数组表示地形,输入后循环,对于每个未标记的草丛,四个方向递归,遇到未标记的草丛则标记,遇到空地则返回
题解
#include <iostream>
using namespace std;
int n, m, map[101][101];
void F(const int& x, const int& y){
if(0 <= x && x < n && 0 <= y && y < m && map[x][y] == 0) map[x][y] = 2;
else return;
F(x+1, y); F(x, y+1);
F(x-1, y); F(x, y-1);
}
int main(){
cin >> n >> m;
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j){
char ch;
cin >> ch;
switch(ch){
case '.': map[i][j] = 1; break;
case '#': map[i][j] = 0; break;
}
}
int ans = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
if(map[i][j] == 0){
F(i, j);
++ans;
}
cout << ans << endl;
return 0;
}