poj2251 - Dungeon Master

来源:互联网 发布:淘宝福建拍卖 编辑:程序博客网 时间:2024/04/16 13:29

 

                                     想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
                                     转载请注明出处:
http://blog.csdn.net/wangjian8006

 

题目大意:

              一个立体空间, 输入三个数,L,R,C,代表有L个平面,R行,C列,.代表可以走,#代表不能走,S代表开始点,E代表结束点,问从S开始走,对每个位置,有六个走法,即空间的六个方向的走法(上下东南西北),一分钟可以走一个点,问从S走到E点,最少可以经过多少分钟,若不能到达,则输出Trapped!

解题思路:

             可以用空间的公式的分解与组合来做,但是容易出错,所以 用三维数组模拟空间立体,用作于BFS来搜索

代码:

#include <iostream>using namespace std;struct q{int x,y,z;}q[30000];int length[30000];int xx[]={1,-1,0,0,0,0};int yy[]={0,0,0,0,-1,1};int zz[]={0,0,-1,1,0,0};bool dis[40][40][40];char map[40][40][40];int l,r,c,sx,sy,sz;int bfs(){int rear,front,dx,dy,dz,i;memset(dis,false,sizeof(dis));memset(length,0,sizeof(length));q[0].x=sx,q[0].y=sy,q[0].z=sz;front=rear=0;while(front<=rear){for(i=0;i<6;i++){dx=q[front].x+xx[i];dy=q[front].y+yy[i];dz=q[front].z+zz[i];if(!dis[dx][dy][dz] && (map[dx][dy][dz]=='.' || map[dx][dy][dz]=='E') && dx>=0 && dx<l && dy>=0 && dy<r && dz>=0 && dz<c){dis[dx][dy][dz]=true;q[++rear].x=dx;q[rear].y=dy;q[rear].z=dz;length[rear]=length[front]+1;if(map[dx][dy][dz]=='E') return length[rear];}}front++;}return 0;}int main(){int i,j,k,key;while(scanf("%d%d%d\n",&l,&r,&c)){if(l==0 && r==0 && c==0) break;for(i=0;i<l;i++,getchar())for(j=0;j<r;j++,getchar())for(k=0;k<c;k++){scanf("%c",&map[i][j][k]);if(map[i][j][k]=='S') sx=i,sy=j,sz=k;}key=bfs();if(key)printf("Escaped in %d minute(s).\n",key);else printf("Trapped!\n");}return 0;}


 

原创粉丝点击