acm pku 3620 avoid the lakes 函数递归题
根据给定文件的信息,本文将围绕“ACM PKU 3620 Avoid the Lakes”这一题目进行解析,重点介绍其使用C语言实现的递归解法。 ### 题目背景与概述 ACM PKU 3620 Avoid the Lakes 是一道经典的递归问题。题目要求在一个给定的地图上寻找最大的连续陆地面积(湖泊为水区,其余为陆地区域)。地图由一个二维数组表示,其中0代表水域,1代表陆地。目标是找到最大连续陆地区域的面积。 ### C语言实现解析 #### 1. 数据结构与变量定义 程序定义了一个`108x108`的二维整型数组`a`来模拟地图。之所以选择`108`是因为题目中的地图大小为`m x n`,为了方便边界处理,这里额外预留了空间。此外,还定义了一些辅助变量用于记录输入参数、遍历过程中遇到的最大连续陆地面积等。 ```c #include<stdio.h> int find(int a[108][108], int i, int j) { if (a[i][j] == 0) return 0; else { (a[i][j]) = 0; return 1 + find(a, i + 1, j) + find(a, i, j + 1) + find(a, i - 1, j) + find(a, i, j - 1); } } int main() { int a[108][108], i, j, count, term = 0; int m, n, k, b, c; scanf("%d%d%d", &m, &n, &k); for (i = 0; i <= m + 1; i++) { for (j = 0; j <= m + 1; j++) { a[i][j] = 0; } } for (i = 0; i < k; i++) { scanf("%d%d", &b, &c); a[b][c] = 1; } for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { if (a[i][j] == 1) { count = find(a, i, j); if (count > term) { term = count; } } } } printf("%d\n", term); return 0; } ``` #### 2. 主函数逻辑 - **初始化**:首先读取地图的尺寸`m`和`n`以及陆地标记的数量`k`。 - **构建地图**:通过循环读取`k`个位置,并在对应的`a`数组中标记为1。 - **搜索最大连续区域**: - 使用两层嵌套循环遍历整个地图。 - 对于每一个标记为1的位置,调用`find`函数计算当前连续区域的面积。 - 更新最大面积`term`。 #### 3. 递归函数`find` `find`函数用于计算当前位置及其周围四个方向的最大连续陆地面积。其核心逻辑如下: - 如果当前位置为水域(值为0),返回0。 - 否则,将当前位置标记为已访问(置为0),并递归地检查其上下左右四个方向。 - 最终结果为当前位置加上四个方向递归得到的结果之和加1。 ### 总结 该题目的C语言递归解决方案简洁明了,易于理解和实现。通过递归方法,我们能够有效地遍历所有可能的连续陆地区域,并计算出最大连续陆地面积。这种方法的关键在于正确地利用递归特性,避免重复计算同一块陆地,同时保证每次递归都能够覆盖所有相邻的陆地部分。对于初学者来说,这是一个很好的学习递归思维的例子。
int find(int a[108][108],int i,int j)
//递归函数,每找到一个淹了的小块,就在它的周边四方寻找其他的被淹小块,同时注销传入函数的小块。
{
if(a[i][j]==0)
return 0;
else { (a[i][j])=0;
return 1+find(a,i+1,j)+find(a,i,j+1)+find(a,i-1,j)+find(a,i,j-1);
}
}
main()
{
int a[108][108],i,j,count,term=0; //定义一个108*108的数组
int m,n,k,b,c;
scanf("%d %d %d",&m,&n,&k);
for(i=0;i<=m+1;i++)
for(j=0;j<=m+1;j++)
a[i][j]=0; //将边界初始化为0,以后每输入一个坐标就对所对应位置置0
for(i=0;i<k;i++)
{ scanf("%d %d",&b,&c);
a[b][c]=1;
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(a[i][j]==1)
{ count=find(a,i,j);
if(count>term) //求最大的湖所占的小块,即湖的面积
term=count;
}
printf("%d\n",term);
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助