题目描述
公园的土地上有一些草坪,除了草坪就是空地,现在有一些熊孩子想要拔除这些草坪。
其中草坪用‘#’表示,空地用‘.’表示。为了方便,一个熊孩子需要铲除连续的草坪,问至少
需要多少熊孩子?
输入格式
第一行输入n,m(1 <= n,m <=100) 表示公园大小
接下来输入 n 行字符串表示公园的大小
输入格式
输出至少需要多少熊孩子
样例输入
5 6
.#....
..#...
..#..#
...##.
.#....
样例输出
5
思路
直接扫描公园,如果遇到草坪‘#’就进行ans++,并利用dfs思想消除连续的草坪,这样只会统计所有连续草坪的个数。
代码示例
#include<iostream>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//方向辅助
char map[101][101];//矩阵存储公园
int n,m,ans;
void dfs(int x,int y)//消除连续草坪
{
if(map[x][y]=='.') return;//终止分支
else {
map[x][y]='.';//消除草坪
int tx,ty;
for(int i=0;i<4;++i){//四个方向
tx=x+dir[i][0];
ty=y+dir[i][1];
if(tx<0||ty<0||tx>=n||ty>=m){
continue;
}
else dfs(tx,ty);
}
}
}
int main()
{
ans=0;
cin>>n>>m;
//memset(vis,0,sizeof(vis));
for(int i=0;i<n;++i){
cin>>map[i];
}
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(map[i][j]=='#'){
ans++;
dfs(i,j);//消除连续草坪
}
}
}
cout<<ans<<endl;
return 0;
}