题目:
农夫约翰的农场在最近的一场暴风雨中被水淹没了,这一事实使他的母牛非常害怕水的信息更加恶化了。但是,他的保险代理只会偿还他的款项,具体数额取决于农场中最大的“湖”的大小。
该农场被表示为矩形栅格用Ñ(1≤ ñ ≤100)行和中号(1≤中号≤100)的列。网格中的每个单元是干燥或淹没,并准确ķ(1≤ ķ ≤ Ñ ×中号)的细胞被淹没。正如人们所期望的那样,一个湖泊有一个中心单元,其他单元通过共享一条长边(而不是一个角)而与之相连。与中心单元共享长边或与任何连接单元共享长边的任何单元都将成为连接单元,并且是湖泊的一部分。
输入值
*第1行:三个以空格分隔的整数:N,M和K
*第2行。K +1:第i +1行描述了一个淹没位置,其中两个空格分隔的整数分别是其行和列:R和C
输出量
*第1行:最大的湖泊包含的单元数。
样本输入
3 4 5
3 2
2 2
3 1
2 3
1 1
样本输出
4
代码
#include<stdio.h>
int f(int i,int j,int q);
int a[110][110];
int N,M,K;
int main()
{
int n,m,i,j,p=0,q;
scanf("%d%d%d",&N,&M,&K);
while(K--)
{
scanf("%d%d",&n,&m);
a[n][m]=1;
}
for(i=0;i<=N;i++)
{
for(j=0;j<=M;j++)
{
//printf("%d ",a[i][j]);
q=0;
if(a[i][j]==1)
q=f(i,j,q);
if(p<q)
p=q;
}
//printf("\n");
}
printf("%d",p);
}
int f(int i,int j,int q)//递归遇到的问题是 两个数之间不停递归; !!!(递归完让它变成0,防止再次递归)!!!
{
q++;
a[i][j]=0;
if(i+1<=N&&a[i+1][j]==1)
q=f(i+1,j,q);
if(i-1>=0&&a[i-1][j]==1)
q=f(i-1,j,q);
if(j+1<=M&&a[i][j+1]==1)
q=f(i,j+1,q);
if(j-1>=0&&a[i][j-1]==1)
q=f(i,j-1,q);
return q;
}
总结:
这个题其实很简单,
需要注意的是做这类寻找二维数组里的最大连通的题时,可以尝试递归过的数是变成初始值防止在两个数之间晃荡(两个数之间递归)!
刚想起了用递归是,就算是无限递归也不会程序崩溃,而是程序结束和无限循环不太一样,无限循环时只是没有输出,程序结束!