poj2251 bfs

简单广搜

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;

#define M 33

char maze[M][M][M], tmp[M];
int L, R, C, sx, sy, sz;
int dist[M][M][M], step[6][3] = { {1, 0, 0}, {-1, 0, 0}, {0, 0, -1},
                                  {0, 0, 1}, {0, 1, 0}, {0, -1, 0} };
bool visit[M][M][M];

bool judge (int x, int y, int z)
{
    if (x >= 0 && x < L && y >= 0 && y < R && z >= 0 && z < C
        && maze[x][y][z] != '#' && !visit[x][y][z])   return true;
    return false;
}

int bfs ()
{
    queue <int> qx, qy, qz;
    memset (visit, false, sizeof (visit));
    memset (dist, 0, sizeof (dist));
    qx.push (sx); qy.push (sy); qz.push (sz);
    visit[sx][sy][sz] = true;
    while (!qx.empty()) {
         int curx = qx.front();
         int cury = qy.front();
         int curz = qz.front();
         qx.pop(); qy.pop(); qz.pop();
         for (int i = 0; i < 6; i++) {
             int tx = curx + step[i][0];
             int ty = cury + step[i][1];
             int tz = curz + step[i][2];
             if (maze[tx][ty][tz] == 'E')
                return dist[curx][cury][curz] + 1;
             if (judge (tx, ty, tz))
             {

                dist[tx][ty][tz] = dist[curx][cury][curz] + 1;
                visit[tx][ty][tz] = true;
                qx.push (tx); qy.push (ty); qz.push (tz);
             }
         }
    }
    return -1;
}
int main()
{
    while (scanf ("%d%d%d", &L, &R, &C)) {
         if (!L && !R && !C) break;

         bool flag = false;
         getchar();
         for (int i = 0; i < L; i++) {
             for (int j = 0; j < R; j++) {
                gets(maze[i][j]);
                for (int k = 0; !flag && k < C; k++)
                if (maze[i][j][k] == 'S') {
                    sx = i; sy = j; sz = k;
                    flag = true;
                }
             }
             gets(tmp);
         }
         int ans = bfs();
         if (ans < 0) printf ("Trapped!\n");
         else printf("Escaped in %d minute(s).\n", ans);
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值