第一次用递归做题,虽然是个水题:哈哈纪念一下!

题目:

农夫约翰的农场在最近的一场暴风雨中被水淹没了,这一事实使他的母牛非常害怕水的信息更加恶化了。但是,他的保险代理只会偿还他的款项,具体数额取决于农场中最大的“湖”的大小。

该农场被表示为矩形栅格用Ñ(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;
}

总结:

这个题其实很简单,
需要注意的是做这类寻找二维数组里的最大连通的题时,可以尝试递归过的数是变成初始值防止在两个数之间晃荡(两个数之间递归)!

刚想起了用递归是,就算是无限递归也不会程序崩溃,而是程序结束和无限循环不太一样,无限循环时只是没有输出,程序结束!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值