poj2251 Dungeon Master

来源:互联网 发布:魔盒软件手机版 编辑:程序博客网 时间:2024/04/23 14:29

题目大意:你在一个3D的地牢里的开始位置,想要逃跑,但只有一个出口,图中”#“号代表被石头阻塞了,不能通过,图中” . “代表可以通过

问题是:让你从开始点找一条最短的途径逃出这个地牢,并输出逃出所需要的时间如:Escaped in 11 minute(s).

若不能能逃出,则输出被套住了”Trapped!

     问题分析:这个是一个单点出发,并逐步的寻求到终点,寻求得是最短路径,所以可以考虑用最短路径盲目搜索法BFS

     代码如下:

                                      

#include<iostream>#include<cstring>#include <queue>using namespace std;typedef class{public:int l,r,c;//层 行 列int depth;  //树深(分钟)}SE;SE s,e;bool matrix[40][40][40]; //存储3D地牢的矩阵int shortminute;//最短时间int L,R,C;//一个方向的数组,共有6个方向,分别为上、下、左、右、前、后int dr[6][3] = {{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};bool myBFS(int l, int r, int c){bool visited[40][40][40] = {false};queue<SE> q;SE p;p.l = l;p.r = r;p.c = c;p.depth = 1;//初始化开始节点visited[l][r][c] = true;q.push(p);while(!q.empty()){//取对首节点,但没弹出SE temp = q.front();//当展开的节点是终点时,寻找截止if(temp.l == e.l && temp.r == e.r && temp.c == e.c){shortminute = temp.depth;e.depth = temp.depth;return true;}int i,j;//每个节点有6种可能的方向可以走for(i = 0;i < 6;i++){int x,y,z;//cout<< dr[i][0]<< dr[i][1]<<dr[i][2]<<endl;x = dr[i][0] + temp.l;y = dr[i][1] + temp.r;z = dr[i][2] + temp.c;//cout<<x<<y<<z<<"  "<<L<<R<<C<<endl;//查看是否越界if(x>0 && x <=L && y>0 && y <= R && z >0 && z <= C){//查看是否访问过,并且该点是否是可通过的,即没被阻塞if(visited[x][y][z] == false && matrix[x][y][z] ){visited[x][y][z] = true;SE pu;pu.l = x;pu.r = y;pu.c = z;//cout<<x<<y<<z<<"  "<<endl;//更新选择的点的深度,从该点展开的所有节点,其深度均加1pu.depth = temp.depth + 1;//将该点加入到队列的末尾,以便于从该点展开q.push(pu);}}}//弹出刚才展开的点,对首q.pop();}return false;}int main(int i,int j,int k){freopen("in.txt","r", stdin);while(cin>>L>>R>>C){if(!L && !R && !C)break;//初始化矩阵,为false表示都不能通过memset(matrix,false,sizeof(matrix));/*Structure the matrix*/for(k=1;k<=L;k++)for(i=1;i<=R;i++)for(j=1;j<=C;j++){char temp;cin>>temp;if(temp=='.')matrix[k][i][j]=true;//当时开始节点时,记录下来if(temp=='S'){matrix[k][i][j]=true;s.l=k;s.r=i;s.c=j;}//记录结束节点if(temp=='E'){matrix[k][i][j]=true;e.l=k;e.r=i;e.c=j;}}if(myBFS(s.l,s.r,s.c))cout<<"Escaped in "<<shortminute-1<<" minute(s)."<<endl;elsecout<<"Trapped!"<<endl;}return 0;} 
   宽度搜索总结:      数据结构:一个是存储整个图的矩阵,如int matrix[40][40][40]               一个记录走过的节点数组,如bool visited[40][40][40]               一个节点移动的方法或是一个数据结构,这里是一个方向数组,int dr[6][3] = {{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};               一个队列,用于将每一个可以走的节点加入队列,以便于从该点进行展开