uva 532 - Dungeon Master

本文详细介绍了在三维空间中使用BFS算法进行路径搜索的方法,包括数据结构设计、算法实现及应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值