题目意思大概是:
哼通过秘密方法得到一张不完整的钓鱼岛航拍地图。钓鱼岛由一个主岛和一些附属岛屿组成,小哼决定去钓鱼岛探险。下面这个10*10的二维矩阵就是钓鱼岛的航拍地图。图中数字表示海拔,0表示海洋,1~9都表示陆地。现在需要计算出最大岛的面积(即有多少个格子)。
1 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 2 | 3 |
3 | 0 | 2 | 0 | 1 | 2 | 1 | 0 | 1 | 2 |
4 | 0 | 1 | 0 | 1 | 2 | 3 | 2 | 0 | 1 |
3 | 2 | 0 | 0 | 0 | 1 | 2 | 4 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 5 | 3 | 0 |
0 | 1 | 2 | 1 | 0 | 1 | 5 | 4 | 3 | 0 |
0 | 1 | 2 | 3 | 1 | 3 | 6 | 2 | 1 | 0 |
0 | 0 | 3 | 4 | 8 | 9 | 7 | 5 | 0 | 0 |
0 | 0 | 0 | 3 | 7 | 8 | 6 | 0 | 1 | 2 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
解题思路:首先明确深搜的作用,可以将一个点上下左右有关联的点全部找到,也就是说,可以通过双重循环来找到可以进行深搜的点,再比较深搜的结果,如果比最小的大,则记录下来。其实也就是在一张图中找到子图的最大面积。
/*最大岛-dfs*/
#include <stdio.h>
int a[101][101];
int book[101][101];
int n,m,max,sum;
void dfs(int i,int j)
{
int k,x,y;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
sum++;
for(k = 0;k < 4;k++)
{
x = i+next[k][0];
y = j+next[k][1];
if(x<1||x>n||y<1||y>m)//边界
{
continue;
}
if(a[x][y]>0&&book[x][y]==0)
{
book[x][y] = 1;
dfs(x,y);
}
}
return ;
}
int main()
{
int i,j,startx,starty;
scanf("%d%d",&n,&m);
for(i = 1;i <= n;i++)
{
for(j = 1;j <= m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i = 1;i <= n;i++)
{
for(j = 1;j <= m;j++)
{
if(a[i][j]>0&&book[i][j]==0)//是陆地,且未标记过
{
book[i][j] = 1;
dfs(i,j);
if(sum>max)
{
max = sum;
}
sum = 0;
}
}
}
printf("%d",max);
return 0;
}