数字地图

算法描述

【问题描述】
Jacky在网上发布了通过无人机航拍的某海域的地图,该海域有很多岛屿,为了能更好地分析该区域的航拍地图,地图被数字化为0到9组成矩阵,0表示该位置为大海,数字1到9都表示陆地(海拔不同),假设在地图坐标m[x][y]处降落,现在要统计降落所在岛屿的面积(有多少个方格),降落点上下左右相连接的陆地为同一岛屿。例如,在如下4行4列的数字化地图中,降落点坐标为(3,3),则所在岛屿的面积为9 。
5 1 0 0
7 9 1 0
0 0 7 3
0 0 4 9

【输入】
第1行为两整数m,n(m行,n列),表示数字化地图m行n列,第2行输入降落地点的坐标x,y,再后面接着输入m行n列的矩阵。
【输出】
只有1行,为降落点所在岛屿的面积。
【输入样例】
4 4
3 3
5 1 0 0
2 6 2 0
0 0 1 9
0 0 7 5
【输出样例】
9

C语言实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*回溯法——深度优先搜索
时间复杂度为n方
*/
#include <stdio.h>
#define max 1000
int map[max][max];
int vis[max][max];//记录i,j位置是否遍历过
int m,n,x,y,num=0;

int dfs(int x,int y){ //深度优先算法
int i,nx,ny;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
for (i=0;i<4;i++) {
nx=x+dx[i];
ny=y+dy[i];
if (nx>=0 && nx<m && ny>=0 && ny<n && map[nx][ny]!=0 && vis[nx][ny]==0){
vis[nx][ny]=1;
if(map[nx][ny]!=map[x][y]) {
num++;}
dfs(nx,ny);//递归
}
else
continue;
}
return num;
}
int main() {
int i,j,max1;
num=0;

printf("请输入岛的大小(m*n):");
scanf("%d %d",&m,&n);
printf("请输入落地点(x*y):");
scanf("%d %d",&x,&y);

for(i=0;i<m;i++)
for(j=0;j<n;j++){
scanf("%d",&map[i][j]);
}

for(i=0;i<m;i++)
for(j=0;j<n;j++)
vis[i][j]=0;

if (vis[x][y]==0 && map[x][y]!=0) {
vis[x][y]=1;
num=1;
max1=dfs(x,y);
}
printf("所在岛屿面积为:%d\n",max1);
return 0;
}

运行截图

运行截图