蒜头君和他的朋友周末相约去召唤师峡谷踏青。他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地。草丛通过上下左右 4 个方向扩展其他草丛形成一片草地,任何一片草地中的格子都是草丛,并且所有格子之间都能通过上下左右连通。如果用'#'
代表草丛,'.'
代表空地,下面的峡谷中有 2 片草地。
1##..
2..##
处在同一个草地的 2 个人可以相互看到,空地看不到草地里面的人。他们发现有一个朋友不见了,现在需要分头去找,每个人负责一片草地,蒜头君想知道他们至少需要多少人。
输入格式
第一行输入 n, m(1≤n,m≤100) 表示峡谷大小。
接下来输入 n 行字符串表示峡谷的地形。
输入格式
输出至少需要多少人。
样例输入复制
5 6 .#.... ..#... ..#..# ...##. .#....
样例输出复制
5
思路:
DFS求连通块,把同一块的草丛都标记
代码:
#include<iostream>
using namespace std;
char s[105][105];
int cot;
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int n,m;
void dfs(int x,int y)
{
s[x][y]='.'; //将草丛置空
for(int i=0;i<4;i++)
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(s[tx][ty]=='#')
dfs(tx,ty);
}
}
//还要求联通块
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>s[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(s[i][j]=='#')
{
cot++;
dfs(i,j);
}
}
cout<<cot<<endl;
return 0;
}