POJ3620 Avoid The Lakes

解决农夫约翰农场中因洪水形成的湖泊问题,通过递归搜索算法找出最大湖泊所覆盖的网格单元数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Avoid The Lakes
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 7521 Accepted: 3958

Description

Farmer John's farm was flooded in the most recent storm, a fact only aggravated by the information that his cows are deathly afraid of water. His insurance agency will only repay him, however, an amount depending on the size of the largest "lake" on his farm.

The farm is represented as a rectangular grid with N (1 ≤ N ≤ 100) rows and M (1 ≤ M ≤ 100) columns. Each cell in the grid is either dry or submerged, and exactly K (1 ≤ K ≤ N × M) of the cells are submerged. As one would expect, a lake has a central cell to which other cells connect by sharing a long edge (not a corner). Any cell that shares a long edge with the central cell or shares a long edge with any connected cell becomes a connected cell and is part of the lake.

Input

* Line 1: Three space-separated integers: NM, and K
* Lines 2..K+1: Line i+1 describes one submerged location with two space separated integers that are its row and column: R and C

Output

* Line 1: The number of cells that the largest lake contains. 

Sample Input

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

Sample Output

4

Source


题目大意:农夫约翰有一块N行M列的田地,这些地分为大小相同的格子,每个格子为1个单位(也就是1*1),这些格子中有K块是有水的,输入K行,每行两个数代表x和y,这点表示有水,请求出最大面积的湖有多少个格子组成。


思路,先把“地图”构成,有水的标记为true,否则标记为false,然后进行递归,

代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAXN 400
using namespace std;

bool mp[MAXN][MAXN];   //记录农田情况
int vis[MAXN][MAXN];   //如果这点没有遍历过为0,否则从1开始依次+1
int N,M,K;
int cot;

void dfs(int r,int c)
{
    if(r>N || r<=0 || c<=0 || c>M) return;
    if(!mp[r][c] || vis[r][c]) return;
    if(!vis[r][c]  && mp[r][c]) {vis[r][c]=cot;cot++;}  //如果这点是水并且没有遍历过,就把计数值cot赋值进去
    dfs(r+1,c);    //进行四个方向的遍历
    dfs(r-1,c);
    dfs(r,c+1);
    dfs(r,c-1);
}

int main()
{
    memset(mp,0,sizeof(mp));
    memset(vis,0,sizeof(vis));
    scanf("%d%d%d",&N,&M,&K);
    while(K--)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        mp[x][y]=true;    //如果这点有水,记为true
    }
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=M;j++)
        {
            cot=1;
            if((!vis[i][j]) && (mp[i][j])) dfs(i,j);   //如果这点没有遍历过,且为true,从这点开始dfs
        }
    }
    int ans=-1;
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=M;j++)
        {
            if(vis[i][j]>ans) ans=vis[i][j];   //求出最大值
        }
    }

    printf("%d\n",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值