问题 1: 最好的草
时间限制: 1 Sec 内存限制: 128 MB
提交: 62 解决: 14
[提交][状态][命题人:admin]
题目描述
奶牛 \text{Bessie}Bessie 计划好好享受柔软的春季新草。新草分布在 R 行 C 列的牧场里。它想计算一下牧场中的草丛数量。
在牧场地图中,每个草丛要么是单个'#',要么是有公共边的相邻两个'#'。给定牧场地图,计算有多少个草丛。
例如,考虑如下 5 行 6 列的牧场地图
.#....
..#...
..#..#
...##.
.#....
这个牧场有 5 个草丛:一个在第一行,一个在三列横跨了二、三行,一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。
输入
第一行包含两个整数 R 和 C,中间用单个空格隔开。(1≤R,C≤100)
接下来 R 行,每行 C 个字符,描述牧场地图。字符只有'#'或'.'两种。
输出
输出一个整数,表示草丛数。
样例输入
5 6
.#....
..#...
..#..#
...##.
.#....
样例输出
5
提示
这一题可能有点难,需要注意一个草丛可能有多个'#'
#include <bits/stdc++.h>
using namespace std;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
int f[101][101],pos[101][101];
int n,m,res;
void bfs(int x,int y){
for(int i=0;i<4;i++){
if(!f[x+dx[i]][y+dy[i]]&&pos[x+dx[i]][y+dy[i]]){
f[x+dx[i]][y+dy[i]]=1;
bfs(x+dx[i],y+dy[i]);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char ch;
cin>>ch;
if(ch=='#'){
pos[i][j]=1;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!f[i][j]&&pos[i][j]) {
f[i][j]=1;
bfs(i,j);
res++;
}
}
}
cout<<res;
return 0;
}