POJ 2251-Dungeon Master(BFS-三維迷宮)
Dungeon Master
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 30842 | Accepted: 11948 |
Description
You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one minute to move one unit north, south, east, west, up or down. You cannot move diagonally and
the maze is surrounded by solid rock on all sides.
Is an escape possible? If yes, how long will it take?
Is an escape possible? If yes, how long will it take?
Input
The input consists of a number of dungeons. Each dungeon description starts with a line containing three integers L, R and C (all limited to 30 in size).
L is the number of levels making up the dungeon.
R and C are the number of rows and columns making up the plan of each level.
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for L, R and C.
L is the number of levels making up the dungeon.
R and C are the number of rows and columns making up the plan of each level.
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for L, R and C.
Output
Each maze generates one line of output. If it is possible to reach the exit, print a line of the form
where x is replaced by the shortest time it takes to escape.
If it is not possible to escape, print the line
Escaped in x minute(s).
where x is replaced by the shortest time it takes to escape.
If it is not possible to escape, print the line
Trapped!
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s). Trapped!
Source
題目意思:
給出一個3D迷宮的層數和長寬,輸入迷宮,可以上下東西南北六個方向移動,計算從S走到E需要的步數。
解題思路:
BFS,用佇列儲存可以走到的每一步,列舉搜尋直到終點。
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<map>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 40
char ma[MAXN][MAXN][MAXN];//存迷宮地圖
int step[MAXN][MAXN][MAXN];//走的步數
bool vis[MAXN][MAXN][MAXN];//是否訪問過
int dir[6][3]= {0,0,1, 0,0,-1, 0,1,0, 0,-1,0, 1,0,0, -1,0,0}; //上下東西南北
bool flag;//能否走出迷宮
int d,r,c,ans;//深度、長度、寬度、總步數
struct Node
{
int x,y,z;//深、長、寬
} s,e;//起始點和終點
void BFS()
{
queue<Node> q;
vis[s.z][s.x][s.y]=true;
q.push(s);
while(!q.empty())
{
Node pos=q.front(),temp;
q.pop();
for(int i=0; i<6; ++i)
{
temp.z=pos.z+dir[i][0];
temp.x=pos.x+dir[i][1];
temp.y=pos.y+dir[i][2];
//是否訪問、是否能走、範圍是否在迷宮內
if(!vis[temp.z][temp.x][temp.y]&&ma[temp.z][temp.x][temp.y]!='#'&&temp.x>=0&&temp.x<r&&temp.y>=0&&temp.y<c&&temp.z>=0&&temp.z<d)
{
if(temp.x==e.x&&temp.y==e.y&&temp.z==e.z)//到達終點
{
ans=step[pos.z][pos.x][pos.y]+1;
flag=true;
return;
}
vis[temp.z][temp.x][temp.y]=true;//標記訪問
step[temp.z][temp.x][temp.y]=step[pos.z][pos.x][pos.y]+1;//增加步數
q.push(temp);
}
}
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("G:/cbx/read.txt","r",stdin);
//freopen("F:/cb/out.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>d>>r>>c&&d&&r&&c)
{
flag=false;
ans=0;
memset(ma,'\0',sizeof(ma));
memset(step,0,sizeof(step));
memset(vis,false,sizeof(vis));
for(int i=0; i<d; ++i)
for(int j=0; j<r; ++j)
for(int k=0; k<c; ++k)
{
cin>>ma[i][j][k];
if(ma[i][j][k]=='S')//起點
s.z=i,s.x=j,s.y=k;
else if(ma[i][j][k]=='E')//終點
e.z=i,e.x=j,e.y=k;
}
BFS();
if(flag) cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
else cout<<"Trapped!"<<endl;
}
}
相關文章
- POJ3984-迷宮問題
- 走迷宮
- 509迷宮
- 藍橋杯-演算法提高 學霸的迷宮(BFS-倒向追蹤輸出移動方向)演算法
- 解密迷宮問題:三種高效演算法Java實現,讓你輕鬆穿越未知迷宮解密演算法Java
- 簡單介紹Python迷宮生成和迷宮破解演算法Python演算法
- PHP 生成迷宮路線PHP
- 【面試】如何找到迷宮出口面試
- POJ 1465-Multiple(BFS-最小整倍數)
- PHP 解迷宮之 H 最小PHP
- Python迷宮生成器Python
- 藍橋杯-走迷宮(BFS)
- 回溯法求迷宮問題
- 自動走迷宮小遊戲~遊戲
- 內容是超正統的迷宮RPG?PSP遊戲《迷宮旅人2》深度解析遊戲
- 迷宮系列(三)利用BFS/DFS的資料得到最短路/通路
- PHP 解迷宮之 G + H 最小PHP
- 用 Canvas + WASM 畫一個迷宮CanvasASM
- 回溯法解決迷宮問題
- 51nod 1459 迷宮遊戲遊戲
- 隨機迷宮生成演算法隨機演算法
- 如何用程式解圖片迷宮?
- C語言動態走迷宮C語言
- 藍橋杯-迷宮(BFS+DFS)
- Dungeon Master(POJ-2251)AST
- POJ-2251 Dungeon MasterAST
- POJ2251 Dungeon MasterAST
- 華為優招面試題---迷宮問題面試題
- UOJ #810. 【UNR #7】位元迷宮
- 「IT運維迷宮」那些讓人頭疼的常見問題與破局之道運維
- 寒假補充專案-回溯法走迷宮
- 用C語言解決迷宮問題C語言
- 7-12 求迷宮最短通道(整合版)
- Python 精靈模組_迷宮房間類遊戲Python遊戲
- 【Javascript + Vue】實現隨機生成迷宮圖片JavaScriptVue隨機
- C++實現迷宮的生成與解決C++
- 【dawn·資料結構】迷宮問題(C++)資料結構C++
- 【ybt高效進階1-5-1】走迷宮