此题为广搜, 使用深搜超时
AC代码:
# include <stdio.h>
# include <string.h>
# define M 50
char dg[M][M][M];
int l, r, c;
int si, sj, sk;
int ei, ej, ek;
int min;
int flag;
int head;
int tail;
int book[M][M][M];
struct QUE
{
int x;
int y;
int z;
int s;
}que[30000];
void bfs();
int main(void)
{
while (scanf("%d %d %d", &l, &r, &c), (l || r || c))
{
int i, j, k;
flag = 0;
memset(book, 0, sizeof(book));
memset(que, 0, sizeof(que));
for (i = 0; i < l; i++)
{
for (j = 0; j < r; j++)
{
scanf("%s", dg[i][j]);
for (k = 0; k < c; k++)
{
if (dg[i][j][k] == 'S')
{
si = i;
sj = j;
sk = k;
book[i][j][k] = 1;
}
}
}
}
//printf("si = %d sj = %d sk = %d\n", si, sj, sk);
head = 1;
tail = 1;
que[head].x = si;
que[head].y = sj;
que[head].z = sk;
que[head].s = 0;
tail++;
book[si][sj][sk] = 1;
bfs();
}
return 0;
}
void bfs()
{
int next[6][3] = {{0, 0, 1}, {0, 1, 0}, {0, 0, -1}, {0, -1, 0}, {1, 0, 0}, {-1, 0, 0}};//方向变量
while(head < tail)
{
for (int k = 0; k < 6; k++)
{
int tx = que[head].x + next[k][0];// 取队列的头部元素
int ty = que[head].y + next[k][1];
int tz = que[head].z + next[k][2];
if (tx < 0 || tx >= l || ty < 0 || ty >= r || tz < 0 || tz >= c)
{
continue;
}
if (book[tx][ty][tz] == 0 && dg[tx][ty][tz] == '.' || dg[tx][ty][tz] == 'E') // 终点的判断不能省(第三个判断条件)
{
book[tx][ty][tz] = 1;
que[tail].x = tx;
que[tail].y = ty;
que[tail].z = tz;
que[tail].s = que[head].s + 1;
tail++;
}
if (dg[tx][ty][tz] == 'E')
{
printf("Escaped in %d minute(s).\n", que[tail-1].s);
return ;
}
}
head++;
}
printf("Trapped!\n");
}