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: N, M, 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;
}