您的位置:首页 > 其它

UVa 532 Dungeon Master( BFS )

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

Ok!细节见代码吧!#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

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

char dun

;
int L, R, C;
int sx, sy, sz;
int ex, ey, ez;
int d

;
bool vis

;
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]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: