本文共 2806 字,大约阅读时间需要 9 分钟。
题目链接:
http://noi.openjudge.cn/ch0205/1253/
http://poj.org/problem?id=2251
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!
3 4 5S.....###..##..###.#############.####...###########.#######E1 3 3S###E####0 0 0
Escaped in 11 minute(s).Trapped!
题目大意与算法分析:
这题是一个三维的迷宫题目,其中用‘.’表示空地,用‘#’表示障碍物,'S'表示出发点,'E'表示终点,求从起点到终点的最小移动次数。解法和二维类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移动到相邻的空位,每次需要花费一分钟,求从起点到终点最少需要多久。输入有若干组测试数据,每一组数据格式如下:
首先输入z,x,y表示三维迷宫的规模,有z层,每层是x行y列。 (z,x,y都在30以内.)然后输入z层的数据,每一层是x*y的字符数组,行内字符之间无空格。当输入的z,x,y都为0时表示输入结束。对每一组测试数据,输出最少需要的时间,格式如"Escaped in 11 minute(s).",每组数据的结果占一行。
假如无法到达,输出"Trapped!".这题用BFS解,每次去队首元素,如果是终点则输出结果移动的次数,否则,从该点开始分别
向东南西北上下移动(如果可以走的话)并继续搜,如果到队列为空还没搜到解法,则说明无解。题解可以参考:
http://www.cnblogs.com/ACShiryu/archive/2011/07/23/2114994.htmlhttp://blog.csdn.net/libin56842/article/details/237023951 #include2 #include 3 #include 4 using namespace std; 5 6 struct obj 7 { 8 int zz,xx,yy; 9 int step;//到达该点的步数 10 }; 11 12 int z,x,y; 13 char a[33][33][33]; 14 queue q; 15 struct obj start,End; 16 bool flag; 17 18 int dz[6]={ 0,0,0,0,1,-1};//上右下左前后 19 int dx[6]={-1,0,1,0,0,0}; 20 int dy[6]={ 0,1,0,-1,0,0}; 21 void BFS();//广搜,数据全部在全局变量 22 23 int main(int argc, char *argv[]) 24 { 25 int i,j,k; 26 27 while(scanf("%d%d%d",&z,&x,&y)!=EOF) 28 { 29 getchar();//吸收回车 30 if(z==0&&x==0&&y==0) break; 31 32 //输入三维迷宫 33 for(k=0;k =0&&tzz =0&&txx =0&&tyy