`
249326109
  • 浏览: 53595 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

uva 532 - Dungeon Master

    博客分类:
  • acm
 
阅读更多

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics