[USACO Nov07] 最大的湖

155. [USACO Nov07] 最大的湖

★   输入文件: lake.in   输出文件: lake.out    简单对比
时间限制:1 s   内存限制:128 MB

译 By CmYkRgB123

描述

在最近的一次暴雨中,Farmer John 的农场被淹没了,形成了一个个湖。更可怕的是他的奶牛们最怕水了。好在他的保险公司会给他一笔数额不菲的赔偿,这笔赔偿金的多少取决与他的农场中最大的湖的大小。

他的农场可以被描绘成 N (1 ≤ N ≤ 100) 行 M (1 ≤ M ≤ 100) 列的一个网格。每一格不是陆地就是湖水,已知有 K (1 ≤ K ≤ N × M) 格是水。每格水只有边相邻,才能算是属于一个湖的,顶点相邻不是。

请你算出他的农场中最大的湖的大小。

输入

  • 第 1 行: 三个整数: N, M, K
  • 第 2..K+1 行: 第 i+1 行两个整数,表示水的位置在第R行,第C列: R , C

输出

  • 第 1 行: 最大的湖的大小(组成它的网格的数量)

样例输入

3 4 5
3 2
2 2
3 1
2 3
1 1

样例输出

4
 
 
简单BFS.
#include<cstdio>
#include<queue>
using namespace std;
int map[110][110];
bool vis[110][110];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int n,m;
struct node{
    int x,y;
}s_pos;
int ans;
void bfs(int sx,int sy){
    queue<node> q;
    s_pos.x=sx; s_pos.y=sy;
    int sum=1;
    vis[sx][sy]=true;
    q.push(s_pos);
    while(!q.empty()){
        node now = q.front();q.pop();
        if(sum>ans) ans=sum;
        for(int i=0;i<4;i++){
            node next = now;
            next.x+=dx[i];  next.y+=dy[i];
            if(!vis[next.x][next.y]&&map[next.x][next.y]==1){
                sum++;
                vis[next.x][next.y]=true;
                q.push(next);
            }
        }

    }

}
int main(){
    freopen("lake.in","r",stdin);
    freopen("lake.out","w",stdout);
    int n,m,k;
    int a,b;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<k;i++){
        scanf("%d%d",&a,&b);
        map[a][b]=1;
    }
    for(int i=1;i<=n;i++){
       for(int j=1;j<=m;j++)
        if(map[i][j]==1&&!vis[i][j]){
             bfs(i,j);
        }
    }
    printf("%d\n",ans);

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值