对于3维的,可以用结构体来储存,详细见下列代码。
样例可以过,不过能不能ac还不知道,疑似poj炸了,
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int INF = 0x3f3f3f3f; int dx[] = {1, -1, 0, 0, 0, 0}; int dy[] = {0, 0, -1, 1, 0, 0}; int dz[] = {0, 0, 0, 0, 1, -1}; int bx, by, bz; int ex, ey, ez; const int maxn = 30 + 5; class POS { public: POS():x_(-1), y_(-1), z_(-1){ } POS(int x, int y, int z):x_(x), y_(y), z_(z){ } int getX(){ return x_;} int getY(){ return y_;} int getZ(){ return z_;} private: int x_, y_, z_; }; typedef POS P; struct Level { char maze[maxn][maxn]; int vis[maxn][maxn]; int d[maxn][maxn]; }; int L, R, C; Level *h; bool op(int x, int y, int z) { if(x >= 0 && x < R && y >= 0 && y < C && z >= 0 && z < L) return true; return false; } int bfs() { queue<P> pos; pos.push(P(bx, by, bz)); while(!pos.empty()) { P p = pos.front(); pos.pop(); if(p.getX() == ex && p.getY() == ey && p.getZ() == ez) break; h[p.getZ()].vis[p.getX()][p.getY()] = 1; for(int i = 0; i < 6; i++) { int curx = p.getX() + dx[i], cury = p.getY() + dy[i], curz = p.getZ() + dz[i]; if(op(curx, cury, curz) && h[curz].maze[curx][cury] != '#' && !h[curz].vis[curx][cury]) { h[curz].vis[curx][cury] = 1; pos.push(P(curx, cury, curz)); h[curz].d[curx][cury] = h[p.getZ()].d[p.getX()][p.getY()] + 1; } } } return h[ez].d[ex][ey]; } int main() { while(cin >> L >> R >> C && (L || R || C)) { bx = by = bz = -1; ex = ey = ez = -1; h = new Level[L]; for(int i = 0; i < L; i++) { for(int j = 0; j < R; j++) { scanf("%s", h[i].maze[j]); //input for(int k = 0; k < C ; k++) { h[i].vis[j][k] = 0; if(h[i].maze[j][k] == 'S') { h[i].d[j][k] = 0; bx = j; by = k; bz = i; } else h[i].d[j][k] = INF; if(h[i].maze[j][k] == 'E') { ex = j; ey = k; ez = i; } } } } int ans = bfs(); if(ans == INF) cout << "Trapped!" << endl; else cout << "Escaped in " << ans << " minute(s)." << endl; delete []h; } }