奶牛 \text{Bessie}Bessie 计划好好享受柔软的春季新草。新草分布在 RR 行 CC 列的牧场里。它想计算一下牧场中的草丛数量。
在牧场地图中,每个草丛要么是单个'#'
,要么是有公共边的相邻两个'#'
。给定牧场地图,计算有多少个草丛。
例如,考虑如下 55 行 66 列的牧场地图
这个牧场有 55 个草丛:一个在第一行,一个在第二列横跨了二、三行,一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。
输入格式
第一行包含两个整数 RR 和 CC,中间用单个空格隔开。(1 \le R, C \le 100)1≤R,C≤100)
接下来 RR 行,每行 CC 个字符,描述牧场地图。字符只有'#'
或'.'
两种。
输出格式
输出一个整数,表示草丛数。
输出时每行末尾的多余空格,不影响答案正确性;
思路:水洼问题简约版,只有四个方向;dfs()完事!!!...
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
char a[100][100];
int n,m;
int ans=0;
int xx[]={0,1,0,-1},yy[]={1,0,-1,0};
void dfs(int x,int y){
a[x][y]='.';//遍历四个方向
for(int i=0;i<4;i++){
int dx=xx[i]+x;
int dy=yy[i]+y;
if(dx>=0&&dy>=0&&dx<n&&dy<m&&a[dx][dy]=='#')
dfs(dx,dy);
}
return;
}
int main(){
while(cin>>n>>m){
for(int i=0;i<n;i++)
scanf("%s",a[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i][j]=='#'){
dfs(i,j);
ans++;
}
printf("%d\n",ans);
}
return 0;
}