问题描述 蒜头君和他的朋友周末相约去召唤师峡谷踏青。他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地。草丛通过上下左右 4 个方向扩展其他草丛形成一片草地,任何一片草地中的格子都是草丛,并且所有格子之间都能通过上下左右连通。如果用’G’代表草丛,’.’代表空地,下面的峡谷中有 2 片草地。 GG… …GG 处在同一个草地的 2 个人可以相互看到,空地看不到草地里面的人。他们发现有一个朋友不见了,现在需要分头去找,每个人负责一片草地,蒜头君想知道他们至少需要多少人。 输入格式 第一行输入n, m(1≤n,m≤100) 表示峡谷大小 接下来输入 n 行字符串表示峡谷的地形 输出格式 输出至少需要多少人
样例输入 5 6 .#.... ..#... ..#..# ...##. .#.... 样例输出 5 #include <bits/stdc++.h> using namespace std; char a[100][101]; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; int n, m; void dfs(int x, int y) { a[x][y] = '.'; for (int k = 0; k < 4; k++) if (a[x + dx[k]][y + dy[k]] == '#' && x + dx[k] >= 0 && x + dx[k] <= n - 1 && y + dy[k] >= 0 && y + dy[k] <= m - 1) dfs(x + dx[k], y + dy[k]); } int solve() { int x, y, count = 0; for (x = 0; x < n; x++) for (y = 0; y < m; y++) { if (a[x][y] == '#') { count++; dfs(x, y); } } return count; } int main() { int i, j; scanf("%d%d", &n, &m); getchar(); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%c", &a[i][j]); } getchar(); } printf("%d", solve()); return 0; }