halisi7

一个专注技术的组织

0%

宝岛探险-c语言

bfs之宝岛探险

问题描述

image-20220420145930672

搞清楚问题之后。你会发现其实就是从(6,8)开始广度优先搜索。每次需要向上下左右四个方向扩展,当扩展出的点大于0时就加入队列,直到队列扩展完毕。所有被加入到队列的点的总数就是小岛的面积。假设地图的大小不超过50*50。

代码实现如下:

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
54
#include <stdio.h>
struct note {
int x;
int y;

};
int main() {
int i, j, n, m, startx, starty,head,tail,tx,ty,k,sum=1;
int a[51][51];//地图
int book[51][51] = {0};//标记用的备份地图
struct note que[2501];//最多50*50个点
int next[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };//四个方向
printf("请输入你要输入几行几列的地图:");
scanf_s("%d %d", &n, &m);
printf("请输入地图:\n");
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
scanf_s("%d", &a[i][j]);
printf("请输入初始位置:");
scanf_s("%d %d", &startx, &starty);
//初始队列
head = 1;
tail = 1;
//赋值初始位置
que[tail].x = startx;
que[tail].y = starty;
//标记初始位置
book[startx][starty] = 1;
//队尾++
tail++;
//当队列不为空时
while (head < tail) {
//枚举四个方向
for (k = 0; k <= 3; k++) {
tx = que[head].x + next[k][0];
ty = que[head].y + next[k][1];
//判断是否越界
if (tx<1 || tx>n || ty<1 || ty>m)
continue;
//入队操作
if (a[tx][ty] > 0 && book[tx][ty] == 0) {
book[tx][ty] = 1;//标记这个点
sum++;//面积增加
que[tail].x = tx;
que[tail].y = ty;
tail++;
}
}
head++;
}
printf("岛屿的大小为:%d", sum);
getchar(); getchar();
return 0;
}

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
请输入你要输入几行几列的地图:10 10
请输入地图:
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
请输入初始位置:6 8

输出

1
岛屿的大小为:38

dfs之宝岛探险

问题描述

image-20220420145930672

搞清楚问题之后。你会发现其实就是从(6,8)开始广度优先搜索。每次需要向上下左右四个方向扩展,当扩展出的点大于0时就加入队列,直到队列扩展完毕。所有被加入到队列的点的总数就是小岛的面积。假设地图的大小不超过50*50。

代码实现如下:

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
#include <stdio.h>
int book[51][51];
int a[51][51];
int n, m ,sum=1;
void dfs(int x,int y) {
int next[4][2] = { {1,0},{0,-1},{-1,0},{0,1} };
int tx,k, ty;
for (k = 0; k <= 3; k++) {
tx = x + next[k][0];
ty = y + next[k][1];
if (tx<1 || tx>n || ty<1 || ty>m)
continue;
if (book[tx][ty] == 0 && a[tx][ty] >= 1) {
book[tx][ty] = 1;
sum++;
dfs(tx, ty);

}
}
return;
}
int main() {
int i, j, startx, starty;
printf("请输入你要输入几行几列的地图:");
scanf_s("%d %d", &n, &m);
printf("请输入地图:\n");
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
scanf_s("%d", &a[i][j]);
printf("请输入你的起始位置:");
scanf_s("%d %d", &startx, &starty);
book[startx][starty] = 1;
dfs(startx, starty);
printf("小岛的面积是:%d", sum);
getchar(); getchar();
return 0;

}

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
请输入你要输入几行几列的地图:10 10
请输入地图:
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
请输入初始位置:6 8

输出

1
小岛的面积是:38

小岛个数问题

问题描述

image-20220420151043846

代码实现

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
54
55
56
57
58
59
#include <stdio.h>
int book[51][51];
int a[51][51];
int n, m, sum = 1 , num;
void dfs(int x, int y,int num) {
int next[4][2] = { {1,0},{0,-1},{-1,0},{0,1} };
int tx, k, ty;

for (k = 0; k <= 3; k++) {
tx = x + next[k][0];
ty = y + next[k][1];

if (tx<1 || tx>n || ty<1 || ty>m)
continue;
if (book[tx][ty] == 0 && a[tx][ty] >= 1) {
book[tx][ty] = 1;
a[tx][ty] = num;
//sum++;
dfs(tx, ty,num);

}
}
return;
}
int main() {
int i, j, startx, starty;
printf("请输入你要输入几行几列的地图:");
scanf_s("%d %d", &n, &m);
printf("请输入地图:\n");
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
scanf_s("%d", &a[i][j]);


for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++) {
if (a[i][j] > 0) {
num--;
a[i][j] = num;
dfs(i, j, num);
}
}
printf("染色后的小岛地图是:\n");
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
printf("%3d", a[i][j]);



}
printf("\n");
}


printf("小岛的个数是:%d", -num);
getchar(); getchar();
return 0;

}

输入

1
2
3
4
5
6
7
8
9
10
11
12
请输入你要输入几行几列的地图:10 10
请输入地图:
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

输出

1
2
3
4
5
6
7
8
9
10
11
12
染色后的小岛地图是:
-1 -1 -1 0 0 0 0 0 -2 -2
-1 0 -1 0 -3 -3 -3 0 -2 -2
-1 0 -1 0 -3 -3 -3 -3 0 -2
-1 -1 0 0 0 -3 -3 -3 0 0
0 0 0 0 0 0 -3 -3 -3 0
0 -3 -3 -3 0 -3 -3 -3 -3 0
0 -3 -3 -3 -3 -3 -3 -3 -3 0
0 0 -3 -3 -3 -3 -3 -3 0 0
0 0 0 -3 -3 -3 -3 0 -4 -4
0 0 0 0 0 0 0 0 -4 0
小岛的个数是:4

总结

image-20220420151301025

打赏一下作者~ ฅ( ̳• ◡ • ̳)ฅ