题目链接 http://poj.org/problem?id=2251
题意:一个立体空间, 输入三个数,L,R,C,代表有L个平面,R行,C列,.代表可以走,#代表不能走,S代表开始点,E代表结束点,问从S开始走,对每个位置,有六个走法,即空间的六个方向的走法(上下东南西北),一分钟可以走一个点,问从S走到E点,最少可以经过多少分钟,若不能到达,则输出Trapped!
简单的三维bfs随便做一下就可以了。
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <queue> using namespace std; char map[40][40][40]; int dr[4][2] = {1 , 0 , 0 , 1 , -1 , 0 , 0 , -1} , vis[40][40][40] , ans , l , r , c; struct TnT { int h , x , y , step; }; int bfs(int h , int x , int y , int step) { memset(vis , 0 , sizeof(vis)); queue<TnT>q; TnT p , gg , gl; p.h = h , p.x = x , p.y = y , p.step = step; vis[p.h][p.x][p.y] = 1; q.push(p); while(!q.empty()) { gg = q.front(); if(map[gg.h][gg.x][gg.y] == 'E') { return gg.step; } for(int j = 0 ; j < 3 ; j++) { if(j == 0) { for(int i = 0 ; i < 4 ; i++) { gl = gg; gl.x += dr[i][0]; gl.y += dr[i][1]; if(gl.x >= 0 && gl.x < r && gl.y >= 0 && gl.y < c && map[gl.h][gl.x][gl.y] != '#' && !vis[gl.h][gl.x][gl.y]) { gl.step++; vis[gl.h][gl.x][gl.y] = 1; q.push(gl); } } } if(j == 1) { if(gg.h > 0 && map[gg.h - 1][gg.x][gg.y] != '#' && !vis[gg.h - 1][gg.x][gg.y]) { gl = gg; gl.step++; gl.h--; vis[gl.h][gl.x][gl.y] = 1; q.push(gl); } } if(j == 2) { if(gg.h < l - 1 && map[gg.h + 1][gg.x][gg.y] != '#' && !vis[gg.h + 1][gg.x][gg.y]) { gl = gg; gl.step++; gl.h++; vis[gl.h][gl.x][gl.y] = 1; q.push(gl); } } } q.pop(); } return -1; } int main() { while(scanf("%d%d%d" , &l , &r , &c)) { if(l == 0 || r == 0 || c == 0) break; int star = 0 , end = 0; for(int i = 0 ; i < l ; i++) { for(int j = 0 ; j < r ; j++) { scanf("%s" , map[i][j]); for(int k = 0 ; k < c ; k++) { if(map[i][j][k] == 'S') { star = i; } if(map[i][j][k] == 'E') { end = i; } } } } ans = 0; for(int i = 0 ; i < r ; i++) { for(int j = 0 ; j < c ; j++) { if(map[star][i][j] == 'S') { ans = bfs(star , i , j , 0); } } } if(ans == -1) { printf("Trapped! "); } else { printf("Escaped in %d minute(s). " , ans); } } return 0; }