Dungeon Master
阿新 • • 發佈:2017-10-22
urn minute class 測試數據 時間限制 解法 bfs struct 左右
時間限制: 1000 ms 內存限制: 65536 KB
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