总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB题目
描述
奶牛Bessie计划好好享受柔软的春季新草。新草分布在R行C列的牧场里。它想计算一下牧场中的草丛数量。
在牧场地图中,每个草丛要么是单个“#”,要么是有公共边的相邻两个“#”。给定牧场地图,计算有多少个草丛。
例如,考虑如下5行6列的牧场地图
.#....
..#...
..#..#
...##.
.#....
这个牧场有5个草丛:一个在第一行,一个在第二列横跨了二、三行,一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。
输入
第一行包含两个整数R和C,中间用单个空格隔开。
接下来R行,每行C个字符,描述牧场地图。字符只有“#”或“.”两种。(1 <= R, C <= 100 )
输出
输出一个整数,表示草丛数。
样例输入
5 6
.#....
..#...
..#..#
...##.
.#....
样例输出
5
思路:
单源BFS有返回值,常用于求迷宫步数,多源BFS常用于求联通块个数,常需要二重循环对所有源点使用BFS
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<set>
#include<stack>
using namespace std;
#define MAX 100
struct node
{
int x,y;
}Node;
int R,C,ans=0;
char G[MAX][MAX];
bool visit[MAX][MAX]={false};
int X[]={1,-1,0,0};
int Y[]={0,0,1,-1};
bool check(int x,int y)
{
if(x>=R||x<0||y>=C||y<0) return 0;
if(G[x][y]=='.'||visit[x][y]==1) return 0;
return 1;
}
void BFS(int x,int y)
{
queue<node > q;
Node.x=x;Node.y=y;
q.push(Node);
visit[x][y]=1;
while(!q.empty())
{
node temp =q.front();
q.pop();
for(int i=0;i<4;i++)
{
int newx=temp.x+X[i];
int newy=temp.y+Y[i];
if(check(newx,newy))
{
Node.x=newx;Node.y=newy;
visit[newx][newy]=1;
q.push(Node);
}
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
while(cin>>R>>C)
{
for(int i=0;i<R;i++)
for(int j=0;j<C;j++)
{
cin>>G[i][j];
}
for(int i=0;i<R;i++)
for(int j=0;j<C;j++)
{
if(visit[i][j]==0&&G[i][j]=='#')
{
ans++;
BFS(i,j);
}
}
cout<<ans<<endl;
}
return 0;
}