bfs之宝岛探险
问题描述
搞清楚问题之后。你会发现其实就是从(6,8)开始广度优先搜索。每次需要向上下左右四个方向扩展,当扩展出的点大于0时就加入队列,直到队列扩展完毕。所有被加入到队列的点的总数就是小岛的面积。假设地图的大小不超过50*50。
代码实现如下:
#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;
}
输入
请输入你要输入几行几列的地图: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
输出
岛屿的大小为:38
dfs之宝岛探险
问题描述
搞清楚问题之后。你会发现其实就是从(6,8)开始广度优先搜索。每次需要向上下左右四个方向扩展,当扩展出的点大于0时就加入队列,直到队列扩展完毕。所有被加入到队列的点的总数就是小岛的面积。假设地图的大小不超过50*50。
代码实现如下:
#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;
}
输入
请输入你要输入几行几列的地图: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
输出
小岛的面积是:38
小岛个数问题
问题描述
代码实现
#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;
}
输入
请输入你要输入几行几列的地图: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 -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