1. 程式人生 > 實用技巧 >Dungeon Master POJ - 2251

Dungeon Master POJ - 2251

原題連結

考察:bfs+三維陣列

思路:

沒什麼好說的,就是三維走迷宮,比二維多兩個方向就是了

POJ請不要用C++11的特性

最短路還是用bfs比較好,一開始用dfs結果貌似棧溢位了

#include <iostream>
#include <cstring> 
#include <queue>
using namespace std;
const int N = 31;
int h,r,c;
char mp[N][N][N];
int dist[N][N][N];
struct Node{
    int x,y,z;
    bool operator
==(Node m) { if(m.x==this->x&&m.y==this->y&&m.z==this->z) return true; else return false; } }Nodes[2]; int bfs(Node st) { int xx[6] = {-1,1,0,0,0,0},yy[6] = {0,0,-1,1,0,0},zz[6] = {0,0,0,0,-1,1}; queue<Node> q; q.push(st); memset(dist,-1,sizeof
(dist)); dist[Nodes[0].z][Nodes[0].x][Nodes[0].y]=0; while(!q.empty()) { Node it = q.front(); q.pop(); int d = dist[it.z][it.x][it.y]; if(it==Nodes[1]) return d; for(int i=0;i<6;i++){ int dx = it.x+xx[i],dy = it.y+yy[i],dz=it.z+zz[i];
if(dx>=0&&dx<r&&dy>=0&&dy<c&&dz>=0&&dz<h&&mp[dz][dx][dy]!='#'&&dist[dz][dx][dy]==-1) { dist[dz][dx][dy] = d+1; Node p; p.x = dx; p.y = dy; p.z = dz; q.push(p); } } } return -1; } int main() { // freopen("in.txt","r",stdin); while(scanf("%d%d%d",&h,&r,&c)!=EOF&&(h!=0||r!=0||c!=0)) { memset(mp,0,sizeof(mp)); for(int k=0;k<h;k++){ for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ cin>>mp[k][i][j]; if(mp[k][i][j]=='S') Nodes[0].x=i,Nodes[0].y=j,Nodes[0].z=k; else if(mp[k][i][j]=='E') Nodes[1].x=i,Nodes[1].y=j,Nodes[1].z=k; } } } int di = bfs(Nodes[0]); if(di==-1) printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n",di); } }