日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通(1248:Dungeon Master)

發(fā)布時間:2025/3/17 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通(1248:Dungeon Master) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1248:Dungeon Master


時間限制: 1000 ms ??? ??? 內(nèi)存限制: 65536 KB
提交數(shù): 8637 ??? 通過數(shù): 3432

【題目描述】

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

【輸入】

多組測試數(shù)據(jù)。

一組測試測試數(shù)據(jù)表示一個三維迷宮:

前三個數(shù),分別表示層數(shù)、一個面的長和寬,后面是每層的平面圖。前三個數(shù)據(jù)為三個零表示結(jié)束。

【輸出】

最小移動次數(shù)。

【輸入樣例】

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

【輸出樣例】

Escaped in 11 minute(s). Trapped!

【提示】

對于題目給出數(shù)據(jù)的含義就是輸入l,r,c,分別代表迷宮有l(wèi)層,每層長寬分別是c,r。對于數(shù)據(jù)以可以這樣移動:

?(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步就可以到達終點 對于數(shù)據(jù)二明顯不能到達,則輸出Trapped!

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

【分析】

? ? ? ? 這題是一個三維的迷宮題目,很顯然,地圖和訪問數(shù)組都是三維的。方向數(shù)組六個方向,除了東南西北,還有上和下。

【參考代碼】

#include <iostream> #include <cstdio> #include <cstring> #include <queue>using namespace std;const int N=110; struct node {int z;int x;int y;int step; };int l,n,m; int vis[N][N][N]; //訪問數(shù)組 char map[N][N][N]; //地圖數(shù)組 int u[][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; //方向數(shù)組 void bfs(node s,node e) {queue <node> q;bool flag=true;q.push(s);while(!q.empty()){node a=q.front();for(int i=0;i<6;i++){node nw;nw.z =a.z+u[i][0];nw.x =a.x+u[i][1];nw.y =a.y+u[i][2];nw.step =a.step +1;if(nw.z >=0 && nw.z <l && nw.x >=0 && nw.x <n && nw.y >=0 && nw.y <m && (!vis[nw.z][nw.x][nw.y]) && map[nw.z][nw.x][nw.y]=='.'){q.push(nw);vis[nw.z][nw.x][nw.y]=1;if(nw.z==e.z && nw.x==e.x && nw.y==e.y){printf("Escaped in %d minute(s).\n",a.step+1);flag=false;return;}}}q.pop();}if(flag)printf("Trapped!\n"); } int main() {while(scanf("%d%d%d",&l,&n,&m)==3,l+n+m){node s,e;memset(vis,0,sizeof(vis));for(int k=0;k<l;k++)for(int i=0;i<n;i++)scanf("%s",map[k][i]);for(int k=0;k<l;k++){for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(map[k][i][j]=='S'){s.z=k;s.x=i;s.y=j;s.step=0;}if(map[k][i][j]=='E'){e.z=k;e.x=i;e.y=j;map[k][i][j]='.';}}}}bfs(s,e);}return 0; }

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

總結(jié)

以上是生活随笔為你收集整理的信息学奥赛一本通(1248:Dungeon Master)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。