POJ-2251 题解
Dungeon Master
题目大意
三维迷宫,找出口
Time: 1000 ms
Memory: 65536 kB
解题思路及分析
搜索
AC代码
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 35;
const int dx[] = {1, -1, 0, 0, 0, 0};
const int dy[] = {0, 0, 1, -1, 0, 0};
const int dz[] = {0, 0, 0, 0, 1, -1};
char mp[N][N][N];
bool vis[N][N][N];
int l, r, c;
struct Pos
{
int x, y, z, t;
Pos() { }
Pos(int x, int y, int z, int t)
{
this->x = x;
this->y = y;
this->z = z;
this->t = t;
}
};
bool judge(int x, int y, int z)
{
return 0 <= x && x < l && 0 <= y && y < r && 0 <= z && z < c;
}
int bfs(Pos pos)
{
queue<Pos> q;
q.push(pos);
vis[pos.x][pos.y][pos.z] = 1;
while (!q.empty())
{
int x = q.front().x;
int y = q.front().y;
int z = q.front().z;
int t = q.front().t;
q.pop();
if (mp[x][y][z] == 'E')
{
return t;
}
for (int i = 0; i < 6; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
int zz = z + dz[i];
if (judge(xx, yy, zz) && mp[xx][yy][zz] != '#' && !vis[xx][yy][zz])
{
vis[xx][yy][zz] = 1;
q.push(Pos(xx, yy, zz, t + 1));
}
}
}
return -1;
}
int main()
{
while (~scanf("%d%d%d", &l, &r, &c) && l && r && c)
{
Pos s;
for (int i = 0; i < l; i++)
{
for (int j = 0; j < r; j++)
{
for (int k = 0; k < c; k++)
{
scanf(" %c", &mp[i][j][k]);
if (mp[i][j][k] == 'S')
{
s = Pos(i, j, k, 0);
}
}
}
}
memset(vis, 0, sizeof(vis));
int ans = bfs(s);
if (ans != -1)
{
printf("Escaped in %d minute(s).\n", ans);
}
else
{
printf("Trapped!\n");
}
}
return 0;
}