C++ 【题解】踏青

题目描述

小白和他的朋友周末相约去召唤师峡谷踏青。他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地。草丛通过上下左右 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;
}
发布了6 篇原创文章 · 获赞 5 · 访问量 757

猜你喜欢

转载自blog.csdn.net/weixin_45425652/article/details/104036879