1248:Dungeon Master
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。
【输入】
多组测试数据。
一组测试测试数据表示一个三维迷宫:
前三个数,分别表示层数、一个面的长和宽,后面是每层的平面图。前三个数据为三个零表示结束。
【输出】
最小移动次数。
【输入样例】
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
【输出样例】
Escaped in 11 minute(s).
Trapped!
【提示】
对于题目给出数据的含义就是输入l,r,c,分别代表迷宫有l层,每层长宽分别是c,r。对于数据以可以这样移动:
(1,1,1)->(1,1,2)->(1,1,3)->(1,1,4)->(1,1,5)->(1,2,5)->
(1,3,5)->(1,3,4)->(1,4,4)->(2,4,4)->(2,4,5)->(3,4,,5)
共11步就可以到达终点 对于数据二明显不能到达,则输出Trapped!
这题用BFS解,每次去队首元素,如果是终点则输出结果移动的次数,否则,从该点开始分别向东南西北上下移动(如果可以走的话)并继续搜,如果到队列为空还没搜到解法,则说明无解。
1. #include <iostream> 2. #include <cstdio> 3. #include <cstring> 4. using namespace std; 5. int s[30][30][30]; 6. int que[100][5]; 7. int c,k,g,i,j,f; 8. int z[6]={0,0,0,0,-1,1}; 9. int x[6]={-1,1,0,0,0,0}; 10. int y[6]={0,0,-1,1,0,0}; 11. int jz,jx,jy; 12. bool bl; 13. char a; 14. void sca(){ 15. memset(s,0,sizeof(s)); 16. for(i=1;i<=g;i++){ 17. for(j=1;j<=k;j++){ 18. for(f=1;f<=c;f++){ 19. cin>>a; 20. if(a=='S') { 21. s[i][j][f]=1; 22. que[1][1]=i;que[1][2]=j;que[1][3]=f;que[1][4]=0; 23. } 24. else if(a=='E') { 25. s[i][j][f]=0; 26. jz=i;jx=j;jy=f; 27. } 28. else if(a=='#') s[i][j][f]=1; 29. else if(a=='.') s[i][j][f]=0; 30. //printf("%c",a); 31. } 32. } 33. //printf("\n"); 34. } 35. } 36. void bfs(){ 37. bl=false; 38. int t=0,w=1; 39. do { 40. t++; 41. for(int i=0;i<6;i++){ 42. int zz=que[t][1]+z[i]; 43. int xx=que[t][2]+x[i]; 44. int yy=que[t][3]+y[i]; 45. if(zz>0&&zz<=g&&xx>0&&xx<=k&&yy>0&&yy<=c&&s[zz][xx][yy]==0){ 46. s[zz][xx][yy]=1; 47. w++; 48. que[w][1]=zz;que[w][2]=xx;que[w][3]=yy;que[w][4]=que[t][4]+1; 49. if(zz==jz&&xx==jx&&yy==jy){ 50. printf("Escaped in %d minute(s).\n",que[w][4]); 51. bl=true;break; 52. } 53. 54. } 55. } 56. }while(w>t&&bl==false); 57. if(!bl) printf("Trapped!\n"); 58. } 59. int main(int argc, char *argv[]) 60. { 61. while(1){ 62. scanf("%d %d %d",&g,&k,&c); 63. if(g==0||k==0||c==0) return 0; 64. sca(); 65. bfs(); 66. } 67. return 0; 68. }