百练3390:最好的草 多源BFS(不同于求步数的单源BFS)

总时间限制: 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;
}

猜你喜欢

转载自blog.csdn.net/zongza/article/details/80187075