這題是今年4月我們校隊選拔時的最後一題,當時用的是一樣的方法怎麼做卻都是WA,最後也沒做出來;時隔3個月再做一遍才AC,也算填上了一個坑。。。orz
POJ-2251 Dungeon Master
Description
你被困在一個三維的空間中,現在要尋找最短路徑逃生!
空間由立方體單位構成
你每次向上下前後左右移動一個單位需要一分鐘
你不能對角線移動並且四周封閉
是否存在逃出生天的可能性?如果存在,則需要多少時間?
Input
輸入第一行是一個數表示空間的數量。
每個空間的描述的第一行爲L,R和C(皆不超過30)。
L表示空間的高度。
R和C分別表示每層空間的行與列的大小。
隨後L層地牢,每層R行,每行C個字符。
每個字符表示空間的一個單元。’#‘表示不可通過單元,’.‘表示空白單元。你的起始位置在’S’,出 口爲’E’。
每層空間後都有一個空行。L,R和C均爲0時輸入結束。
Output
每個迷宮對應一行輸出。
如果可以逃生,則輸出如下
Escaped in x minute(s).
x爲最短脫離時間。
如果無法逃生,則輸出如下
Trapped!
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
思路:BFS模板題,沒什麼好講的
AC代碼:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
char t[32][32][32];
int vis[32][32][32];
int dir[6][3] = {{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}}; //移動的六個方向
int sl,sr,sc,er,ec,el;
struct node{
int l,r,c,cnt;
};
int l,r,c;
//檢查是否越界或者撞到牆壁,如果沒有則返回true
bool nex_lim(int ll,int rr,int cc)
{
if(ll<0||ll>=l||rr<0||rr>=r||cc<0||cc>=c||t[ll][rr][cc] == '#')
return false;
else
return true;
}
int bfs(queue<node> &q)
{
while(!q.empty()){
node f = q.front();
int fl = f.l, fr = f.r, fc = f.c, ft = f.cnt;
for(int i=0;i<6;i++)
if(nex_lim(fl+dir[i][0],fr+dir[i][1],fc+dir[i][2]) && !vis[fl+dir[i][0]][fr+dir[i][1]][fc+dir[i][2]])
{
if(fl+dir[i][0]==el && fr+dir[i][1]== er && fc+dir[i][2] == ec)
return ft+1;
node temp = {fl+dir[i][0],fr+dir[i][1],fc+dir[i][2],ft+1};
vis[fl+dir[i][0]][fr+dir[i][1]][fc+dir[i][2]] = 1; //訪問過的點不要忘記標成vis1
q.push(temp);
}
q.pop();
}
return -1;
}
int main()
{
scanf("%d %d %d",&l,&r,&c); getchar();
while(l){
memset(vis,0,sizeof vis);
for (int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
for(int k=0;k<c;k++)
{
t[i][j][k] = getchar();
if(t[i][j][k]=='S')
{
sl = i; sr = j; sc = k;
}
else if(t[i][j][k]=='E')
{
el = i; er = j; ec = k;
}
}
getchar();
}
getchar();
}
queue<node> q;
node temp = {sl,sr,sc,0};
q.push(temp); //因爲queue沒有clear方法,所以聲明爲內部變量而不是全局變量
vis[sl][sr][sc] = 1;
int a = bfs(q);
if(a!=-1) cout << "Escaped in " <<a << " minute(s)." << endl;
else puts("Trapped!");
scanf("%d %d %d",&l,&r,&c); getchar();
}
return 0;
}