首页 > 代码库 > poj 2251 Dungeon Master(bfs)
poj 2251 Dungeon Master(bfs)
题目链接 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!\n"); } else { printf("Escaped in %d minute(s).\n" , ans); } } return 0;}
poj 2251 Dungeon Master(bfs)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。