bfs在三维空间的扩展,仔细一点问题不大。
#include<stdio.h>
#include<string.h>
typedef struct Point {
int x;
int y;
int z;
int len;
} Point;
typedef Point* Ptr;
char dungeon[40][40][40];
int l, r, c;
int dir[6][3] = { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0,
1 }, { 0, 0, -1 } };
Point start;
Point end;
Point queue[100000];
int length;
int bfs() {
int front = 0;
int rear = 1;
queue[0].x = start.x;
queue[0].y = start.y;
queue[0].z = start.z;
queue[0].len = start.len;
dungeon[start.x][start.y][start.z] = '#';
int i, newX, newY, newZ;
while (front < rear) {
Ptr p = &queue[front++];
for (i = 0; i < 6; i++) {
newX = p->x + dir[i][0];
newY = p->y + dir[i][1];
newZ = p->z + dir[i][2];
if (newX >= 0 && newX < l && newY >= 0 && newY < r && newZ >= 0
&& newZ < c && dungeon[newX][newY][newZ] != '#') {
if (newX == end.x && newY == end.y && newZ == end.z) {
return p->len + 1;
}
queue[rear].x = newX;
queue[rear].y = newY;
queue[rear].z = newZ;
queue[rear].len = p->len + 1;
dungeon[newX][newY][newZ] = '#';
rear++;
}
}
}
return -1;
}
int main() {
while (scanf("%d%d%d", &l, &r, &c) != EOF) {
if (l == 0)
break;
length = -1;
memset(dungeon, 0, sizeof(dungeon));
getchar();
int i, j, k;
for (i = 0; i < l; i++) {
for (j = 0; j < r; j++) {
for (k = 0; k < c; k++) {
scanf("%c", &dungeon[i][j][k]);
if (dungeon[i][j][k] == 'S') {
start.x = i;
start.y = j;
start.z = k;
start.len = 0;
} else if (dungeon[i][j][k] == 'E') {
end.x = i;
end.y = j;
end.z = k;
end.len = -1;
}
}
getchar();
}
getchar();
}
length = bfs();
if (length >= 0)
printf("Escaped in %d minute(s).\n", length);
else
printf("Trapped!\n");
}
return 0;
}
本文详细介绍了在三维空间中使用BFS算法进行路径搜索的方法,包括数据结构设计、算法实现及应用实例。
154

被折叠的 条评论
为什么被折叠?



