UVa 532 Dungeon Master( BFS )

感觉自己就是一个马虎妞,又是细节的问题,真是不应该的!以后写程序一定要注意了!这个题没什么特别的,就是三维数组,每次出了能走平面以外,还可以走上下的这种!

Ok!细节见代码吧!

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

const int N = 35;
const int INF = 10000000;

char dun[N][N][N];
int L, R, C;
int sx, sy, sz;
int ex, ey, ez;
int d[N][N][N];
bool vis[N][N][N];
int a1[] = { 0, 0, 0, 0, 1, -1 };
int a2[] = { 0, 0, 1, -1, 0, 0 };
int a3[] = { 1, -1, 0, 0, 0, 0 };
struct Node { int x, y, z; } tmp, u;

void BFS() {
    memset( vis, false, sizeof(vis) );
    for ( int i = 0; i < L+3; ++i ) for ( int j = 0; j < R+3; ++j ) for ( int k = 0; k < C+3; ++k ) d[i][j][k] = INF;
    vis[sz][sx][sy] = 1;
    d[sz][sx][sy] = 0;
    tmp.x = sx, tmp.y = sy, tmp.z = sz;
    queue <Node> q;
    q.push(tmp);
    while ( !q.empty() ) {
        u = q.front(); q.pop();
        //printf("%d %d %d %d\n", u.z, u.x, u.y, d[u.z][u.x][u.y]);
        //printf("%d %d %d %d\n", ez, ex, ey, d[ez][ex][ey]);
        if ( u.x == ex && u.y == ey && u.z == ez ) break;
        for ( int i = 0; i < 6; ++i ) {
            int xx = u.x + a1[i], yy = u.y + a2[i], zz = u.z + a3[i], dist = d[u.z][u.x][u.y];
            if ( dun[zz][xx][yy] != '#' && !vis[zz][xx][yy] && d[zz][xx][yy] > d[u.z][u.x][u.y] + 1 ) {
                d[zz][xx][yy] = d[u.z][u.x][u.y] + 1;
                vis[zz][xx][yy] = true;
                tmp.x = xx, tmp.y = yy, tmp.z = zz;
                q.push(tmp);
            }
        }
    }
}

int main()
{
    while ( scanf("%d%d%d", &L, &R, &C) != EOF && ( L || R || C ) ) {
        getchar();
        memset(dun, '\0', sizeof(dun));
        for ( int li = 0; li <= L+1; ++li ) {
           for ( int ri = 0; ri <= R + 1; ++ri ) dun[li][ri][0] = dun[li][ri][C+1] = '#';
           for ( int ci = 0; ci <= C + 1; ++ci ) dun[li][0][ci] = dun[li][R+1][ci] = '#';
        }
        for ( int ri = 0; ri <= R + 1; ++ri ) 
           for ( int ci = 0; ci <= C + 1; ++ci ) dun[0][ri][ci] = dun[L+1][ri][ci] = '#';
        for ( int li = 1; li <= L; ++li ) {
            for ( int ri = 1; ri <= R; ++ri, getchar() ) 
                for ( int ci = 1; ci <= C; ++ci ) {
                    scanf("%c", &dun[li][ri][ci]);
                    if ( dun[li][ri][ci] == 'S' ) sx = ri, sy = ci, sz = li;
                    else if ( dun[li][ri][ci] == 'E' ) ex = ri, ey = ci, ez = li;
                }
            getchar();
        }
        //for ( int li = 0; li <= L+1; ++li, printf("\n")) for ( int ri = 0; ri <= R+1; ++ri, printf("\n")) for ( int ci = 0; ci <= C+1; ++ci ) printf("%c", dun[li][ri][ci]);
        BFS();
        if ( d[ez][ex][ey] == INF ) printf("Trapped!\n");
        else printf("Escaped in %d minute(s).\n", d[ez][ex][ey]);
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值