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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

(BFS)Dungeon Master(poj2251)

發布時間:2025/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (BFS)Dungeon Master(poj2251) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

你被困在一個3D地牢中且繼續尋找最短路徑逃生!地牢由立方體單位構成,立方體中不定會充滿巖石。向上下前后左右移動一個單位需要一分鐘。你不能對角線移動并且迷宮四周堅石環繞。

是否存在逃出生天的可能性?如果存在,則需要多少時間?
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!

分析與解答

有圖的這種搜索,先把圖存到數組里,三個方向移動,每個方向可以往前往后走,就寫一個方向數組,(3*2)*3的數組
然后把起點先push到queue里,之后把每個移動的可能情況都考慮到,每移動一次,如果滿足這個坐標沒出現過,這個坐標沒越界,這個坐標是可以移動的,就push到queue里,然后標記數組標記移動到的坐標,并將step增加
這個層都放到queue之后,下一次循環開始還是先取出第一個數,然后繼續

#include <iostream> #include <stdio.h> #include <string.h> #include <queue> #include <algorithm> using namespace std;char map[35][35][35]; int vis[35][35][35]; int k,n,m,sx,sy,sz,ex,ey,ez; int to[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};struct node {int x,y,z,step; };int check(int x,int y,int z) {if(x<0 || y<0 || z<0 || x>=k || y>=n || z>=m)return 1;else if(map[x][y][z] == '#')return 1;else if(vis[x][y][z])return 1;return 0; }int bfs() {int i;node a,next;queue<node> Q;a.x = sx,a.y = sy,a.z = sz;a.step = 0;vis[sx][sy][sz] = 1;Q.push(a);while(!Q.empty()){a = Q.front();Q.pop();if(a.x == ex && a.y == ey && a.z == ez)return a.step;for(i = 0; i<6; i++){next = a;next.x = a.x+to[i][0];next.y = a.y+to[i][1];next.z = a.z+to[i][2];if(check(next.x,next.y,next.z))continue;vis[next.x][next.y][next.z] = 1;next.step = a.step+1;Q.push(next);}}return 0; }int main() {int i,j,r;while(scanf("%d%d%d",&k,&n,&m),n+m+k){for(i = 0; i<k; i++){for(j = 0; j<n; j++){scanf("%s",map[i][j]);for(r = 0; r<m; r++){if(map[i][j][r] == 'S'){sx = i,sy = j,sz = r;}else if(map[i][j][r] == 'E'){ex = i,ey = j,ez = r;}}}}memset(vis,0,sizeof(vis));int ans;ans = bfs();if(ans)printf("Escaped in %d minute(s).\n",ans);elseprintf("Trapped!\n");}return 0; }

總結

以上是生活随笔為你收集整理的(BFS)Dungeon Master(poj2251)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。