Description
Input
Output
Escaped in x minute(s).
Trapped!
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
输入
输入由一个地牢。 每个地牢描述开头一行包含三个整数L R和C(所有大小限制在30)。L是水平占地牢的数量。R和C的行数和列在每个层次的计划。然后将遵循L R线每个块包含C字符。 每个字符描述了地牢里的一个细胞。 细胞完整的岩石是由一个“#”表示和空细胞是由一个“。”表示。 你的起始位置是由“年代”,表示退出由字母“E”。 每个层次有一个空行后。输入终止三0 L R和C。
输出
每个迷宫生成一行输出。 如果可以达到出口,打印一行的形式逃在x分钟(s)。 其中x是取而代之的是最短的时间逃跑。如果它是不可能逃脱,打印被困!
解题思路:这是一道搜索的题目,此题我用了BFS,之前用了DFS结果超时了,然后不知道该怎么剪枝,所以就没过,下面是BFS,详解见代码标注
具体代码: #include <stdio.h> #include <string.h> #include <queue> using namespace std; char map[35][35][35]; int used[35][35][35]; int L,R,C,time; struct Node { int x,y,z,t;//记录点的行、列、层、时间 }; queue<Node> Q; Node D; void add(int L,int R,int C,int time) { //搜索该点周围所有满足条件的点,如果可以继续走下去,则时间++, //六个方向,上、下、左、右、前、后,下面写的并不是按照所述的这个方向 //效果都一样 D.x=L;D.y=R;D.z=C+1; if(map[D.x][D.y][D.z]!='#' && used[D.x][D.y][D.z]==0) { D.t=time+1;Q.push(D); } D.x=L;D.y=R+1;D.z=C; if(map[D.x][D.y][D.z]!='#' && used[D.x][D.y][D.z]==0) { D.t=time+1;Q.push(D); } D.x=L+1;D.y=R;D.z=C; if(map[D.x][D.y][D.z]!='#' && used[D.x][D.y][D.z]==0) { D.t=time+1;Q.push(D); } D.x=L;D.y=R;D.z=C-1; if(map[D.x][D.y][D.z]!='#' && used[D.x][D.y][D.z]==0) { D.t=time+1;Q.push(D); } D.x=L;D.y=R-1;D.z=C; if(map[D.x][D.y][D.z]!='#' && used[D.x][D.y][D.z]==0) { D.t=time+1;Q.push(D); } D.x=L-1;D.y=R;D.z=C; if(map[D.x][D.y][D.z]!='#' && used[D.x][D.y][D.z]==0) { D.t=time+1;Q.push(D); } } int BFS(int L,int R,int C) { memset(used,0,sizeof(used));//标记数组 while(!Q.empty()) { D=Q.front();//取队列头部的点 Q.pop(); L=D.x;R=D.y;C=D.z; if(map[L][R][C]=='E')//如果是E,则说明找到了,直接返回时间 return D.t; else if(map[L][R][C]=='S') {//如果是S,说明是起点,则BFS,把起点周围能走的点都加入队列 used[L][R][C]=1;//并标记此点,下次不再搜索 add(L,R,C,0);//从起点开始的时间是0 } else if(map[L][R][C]=='.' && used[L][R][C]==0) {//如果是 . 且还是没有走过的,则标记此点,并将周围满足条件的入队 used[L][R][C]=1; add(L,R,C,D.t); } } return -1; } int main() { while(scanf("%d%d%d",&L,&R,&C) && L||R||C) { int i,j,t; memset(map,'#',sizeof(map));//初始化map,将map的外围加一层 #,即墙 for(i=1;i<=L;i++) { getchar(); for(j=1;j<=R;j++) { for(t=1;t<=C;t++) { scanf("%c",&map[i][j][t]); if(map[i][j][t]=='S') { D.x=i;D.y=j;D.z=t; Q.push(D);//记录S的位置,并把此状态压入队列 } } getchar(); } } int ans=BFS(D.x,D.y,D.z); while(!Q.empty())//把队列里的元素都释放出来,以免影响下一次操作 Q.pop(); if(ans!=-1) printf("Escaped in %d minute(s).\n",ans); else printf("Trapped!\n"); } return 0; }