这题千万不能用dfs做,dfs找最短路径不是好办法。
要用bfs可以很好的解决最短路径问题。
这题迷宫,第一个放进去的是距离为为0的那个1起始点,这是后他周围的点存进去,队列里接下去就是距离为1,相当于于树的层次遍历。。
这样最先找到的,肯定是步数最小的。。。
AC代码:
#include<stdio.h>
#include<queue>
using namespace std;
struct po{
int x;
int y;
int z;
int dis;
} p1,p2;
int cx[6] = {0,0,-1,1,0,0};
int cy[6] = {1,-1,0,0,0,0};
int cz[6] = {0,0,0,0,1,-1};
const int N = 100;
queue<po> q;
char maze[N][N][N];
char vis[N][N][N];
bool find;
int res;
int bx,by,bz,ex,ey,ez;
void init() {
for (int i = 0 ; i < N; i++) {
for (int j = 0 ;j < N ; j++) {
for (int k = 0 ;k < N; k++) {
maze[i][j][k] = '#';
vis[i][j][k] = false;
}
}
}
find = false;
res = 0;
while(!q.empty())
q.pop();
}
void bfs() {
p1.x = bx;
p1.y = by;
p1.z = bz;
p1.dis = 0;
q.push(p1);
while (!q.empty()) {
p1 = q.front();
q.pop();
int x1 = p1.x;
int y1 = p1.y;
int z1 = p1.z;
int s = p1.dis;
for (int i = 0; i < 6 ;i++) {
int x2 = x1 + cx[i];
int y2 = y1 + cy[i];
int z2 = z1 + cz[i];
if (maze[z2][y2][x2] != '#' && vis[z2][y2][x2] == false) {
if(x2 == ex && y2 == ey && z2 == ez) {
find = true;
res = s + 1;
break;
}
vis[z2][y2][x2] = true;
p2.x = x2 ; p2.y = y2 ; p2.z = z2;p2.dis = s + 1;
q.push(p2);
}
}
if (find == true)
break;
}
}
int main () {
int x,y,z;
while (scanf("%d%d%d",&z,&y,&x) ) {
getchar();
if (z == 0 && y == 0 && z == 0)
break;
init();
for (int i = 1 ; i <= z; i++) {
for (int j = 1 ;j <= y ; j++) {
for (int k = 1 ;k <= x; k++) {
scanf("%c",&maze[i][j][k]);
}
getchar();
}
getchar();
}
for (int i = 1 ; i <= z; i++) {
for (int j = 1 ;j <= y ; j++) {
for (int k = 1 ;k <= x; k++) {
if (maze[i][j][k] == 'S') {
bx = k;
by = j;
bz = i;
}
if (maze[i][j][k] == 'E') {
ex = k;
ey = j;
ez = i;
}
}
}
}
bfs();
if (find == true)
printf("Escaped in %d minute(s).\n",res);
else
printf("Trapped!\n");
}
return 0;
}