Dungeon Master POJ-2251 三维BFS

题目链接:http://poj.org/problem?id=2251

题目大意

你被困在了一个三维的迷宫,找出能通往出口的最短时间。如果走不到出口,输出被困。

思路

由于要找最短路径,其实就是BFS。一般的BFS是前后左右四个方向,这个题相当于是变成能往上下左右前后六个方向找。修改一下二维BFS搜索部分的代码即可。

题解

  1 #include <iostream>
  2 #include <queue>
  3 #include<fstream>
  4 #include <cstring>
  5 //#define debug
  6 using namespace std;
  7 
  8 char a[35][35][35];
  9 int vis[35][35][35];
 10 int x,y,z;                          //范围
 11 
 12 int d1[7] = {1,-1,0,0,0,0};
 13 int d2[7] = {0,0,1,-1,0,0};
 14 int d3[7] = {0,0,0,0,1,-1};
 15 
 16 struct point{
 17     int x;
 18     int y;
 19     int z;
 20     int step;
 21 }p1,p2,e;
 22 
 23 bool isValid(point p){
 24     if(p.x>=0 && p.x<x && p.y>=0 && p.y<y && p.z>=0 && p.z<z && (a[p.x][p.y][p.z] == '.' || a[p.x][p.y][p.z] == 'E' )&& vis[p.x][p.y][p.z] == 0){
 25         return true;
 26     }
 27     return false;
 28 }
 29 
 30 bool success(point p){
 31     if(p2.x == e.x && p2.y == e.y && p2.z == e.z){
 32         return true;
 33     }
 34     return false;
 35 }
 36 
 37 void bfs(){
 38         point tmp;
 39         queue<point> q;
 40         q.push(p1);
 41         while(!q.empty()){
 42             p2 = q.front();
 43             q.pop();
 44             if(success(p2)){
 45                 return;
 46             }else{
 47                 for(int ii=0;ii<6;ii++){    //向六个方向搜索
 48                     tmp.x = p2.x+d1[ii];
 49                     tmp.y = p2.y+d2[ii];
 50                     tmp.z = p2.z+d3[ii];
 51                     if(isValid(tmp)){
 52                         tmp.step = p2.step+1;
 53                         vis[tmp.x][tmp.y][tmp.z]= 1;
 54                         q.push(tmp);
 55                     }
 56                 }
 57             }
 58         }
 59 }
 60 
 61 
 62 int main()
 63 {
 64     #ifdef debug
 65     //cin重定向
 66     ifstream cin("C:\\Users\\Administrator\\Desktop\\test.txt");
 67     #endif
 68 
 69     while((cin >> x >> y >> z)){
 70         if(x == 0){
 71             break;
 72         }
 73         for(int i = 0;i < x;i++){       //读入maze
 74             for(int j = 0;j < y;j++){
 75                 for(int k = 0;k < z;k++){
 76                     cin >> a[i][j][k];
 77                     if(a[i][j][k] == 'S'){
 78                         p1.x = i;
 79                         p1.y = j;
 80                         p1.z = k;
 81                         p1.step = 0;
 82                     }else if(a[i][j][k] == 'E'){
 83                         e.x = i;
 84                         e.y = j;
 85                         e.z = k;
 86                     }
 87                 }
 88             }
 89         }
 90 
 91         memset(vis,0,sizeof(vis));      //初始化vis
 92 
 93         bfs();
 94         if(p2.x == e.x && p2.y == e.y && p2.z == e.z){
 95             cout << "Escaped in " << p2.step << " minute(s)." << endl;
 96         }else{
 97             cout << "Trapped!" << endl;
 98         }
 99     }
100 }

 

posted @ 2019-01-18 22:14  SaltyFishQF  阅读(148)  评论(0编辑  收藏  举报