1. 程式人生 > >Dungeon Master

Dungeon Master

urn minute class 測試數據 時間限制 解法 bfs struct 左右

Dungeon Master

鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1248


時間限制: 1000 ms 內存限制: 65536 KB

【題目描述】

這題是一個三維的迷宮題目,其中用‘.’表示空地,‘#’表示障礙物,‘S’表示起點,‘E’表示終點,求從起點到終點的最小移動次數,解法和二維的類似,只是在行動時除了東南西北移動外還多了上下。可以上下左右前後移動,每次都只能移到相鄰的空位,每次需要花費一分鐘,求從起點到終點最少要多久。

【輸入】

多組測試數據。

一組測試測試數據表示一個三維迷宮:

前三個數,分別表示層數、一個面的長和寬,後面是每層的平面圖。前三個數據為三個零表示結束。

【輸出】

最小移動次數。

【輸入樣例】

3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0

【輸出樣例】

Escaped in 11 minute(s).
Trapped!

【提示】

對於題目給出數據的含義就是輸入l,r,c,分別代表迷宮有l層,每層長寬分別是c,r。對於數據以可以這樣移動:

(1,1,1)->(1,1,2)->(1,1,3)->(1,1,4)->(1,1,5)->(1,2,5)->

(1,3,5)->(1,3,4)->(1,4,4)->(2,4,4)->(2,4,5)->(3,4,,5)

共11步就可以到達終點 對於數據二明顯不能到達,則輸出Trapped!

這題用BFS解,每次去隊首元素,如果是終點則輸出結果移動的次數,否則,從該點開始分別向東南西北上下移動(如果可以走的話)並繼續搜,如果到隊列為空還沒搜到解法,則說明無解。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int L,r,c,qx,qy,qz;
const int maxn=105;
char mp[maxn][maxn][maxn];
int x1[7]={0,0,0,0,1,-1}; int y1[7]={1,-1,0,0,0,0}; int z1[7]={0,0,1,-1,0,0}; struct node { int z,x,y,step; node ():z(),x(),y(),step(){} node (const int z,const int x,const int y,const int step):z(z),x(x),y(y),step(step){} }; void bfs() { queue <node>Q; Q.push(node(qz,qx,qy,0)); mp[qz][qx][qy]=#; while(!Q.empty()) { node nw=Q.front(); Q.pop(); for(int i=0;i<7;i++) { int zn=nw.z+z1[i],xn=nw.x+x1[i],yy1=nw.y+y1[i]; if(zn>=0&&zn<L&&xn>=0&&xn<r&&yy1>=0&&yy1<c&&(mp[zn][xn][yy1]==.||mp[zn][xn][yy1]==E)) { if(mp[zn][xn][yy1]==E) { printf("Escaped in %d minute(s).\n",nw.step+1); return ; } Q.push(node(zn,xn,yy1,nw.step+1)); mp[zn][xn][yy1]=#; } } } cout<<"Trapped!"<<endl; } int main() { while(cin>>L>>r>>c) { if(r==0&&L==0&&c==0)break; memset(mp,0,sizeof(mp)); char a; for(int i=0;i<L;i++) for(int j=0;j<r;j++) { scanf("%s",mp[i][j]); for(int m=0;m<c;m++) if(mp[i][j][m]==S) { qz=i;qx=j;qy=m; } } bfs(); } }

Dungeon Master