算法-搜索-闪避湖泊

题目描述

农夫约翰的农场在最近的一场暴风雨中被水淹没。但保险公司仅根据他得农场中最大的“湖泊”的大小赔偿一个数额。
农场可表示为N行M列的长方形网格,(1≤N≤100,1≤M≤100)。网格中的每个单元或是干的或是被淹没的,且恰有K个单元被水淹没,(1≤K≤N*M)。正如人们所希望的,湖泊是一个中间单元,它与其他的单元共享一条长边(不是角落)。任何与中间单元共享一条长边或者与连通单元共享一条长边的单元是一个连通单元,是湖泊的一部分。

输入

有多组数据。每组的第1行有3个整数N,M和K。第2行到第K+1行,是整数R和C,表示被淹没的位置。

输出

对每组测试数据,输出有最大湖泊的单元的数目。

样例输入 
3 4 5
3 2
2 2
3 1
2 3
1 1
样例输出 
4
代码实现
#include 
#include 
using namespace std;

int farm[105][105];        
int sum;

void Lake(int i, int j)
{
	if(farm[i][j]==1){
		sum++;      //相连的农田数加1
		farm[i][j]=0;
		Lake(i+1,j);
		Lake(i-1,j);  //所输入的农田坐标从1开始编号,而初始化时flag全部为0,所以不会产生越界访问
		Lake(i,j-1);
		Lake(i,j+1);
	}
}

int main()
{
	int n,m,k;
	int r,c;
	while(~scanf("%d %d %d",&n,&m,&k)){
	    memset(farm,0,sizeof(farm));
	    int num=0;
		for(int i=1;i<=k;i++){
			cin>>r>>c;
			farm[r][c]=1;          //将需要查询的元素置为1
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
			    sum=0;
				if(farm[i][j]==1){    //当需要查询时再去查询
				    Lake(i,j);
				    if(sum>num){
				        num=sum;
				    }
				}
			}
		}
		cout<

你可能感兴趣的:(算法)