Dungeon Master POJ

来源:互联网 发布:ubuntu skype安装包 编辑:程序博客网 时间:2024/06/08 19:51

题目链接:https://vjudge.net/problem/POJ-2251

题目描述:给定一个长宽高分别为R、C、L的立体空间,S代表起点,E表示终点,"."表示可通过,"#"表示不可通过,每次可从当前坐标向前后左右上下六个方向移动,但是不可以对角移动。求起点到终点最短路,若不可达,输出“Trapped!”。

思路;BFS常适用于搜索最短路径的解,BFS过程中搜索到的解一定是离根最近的,即最优解。DFS常适用于搜索全部的解。显然,本题比较适合用BFS,至于代码,跟着BFS模板的套路走就好,注意处理细节问题。详细注释说明见代码。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<cstdlib>#include<sstream>#include<deque>#include<stack>#include<set>#include<map>using namespace std;typedef long long ll;typedef unsigned long long ull;const double eps = 1e-6;const int  maxn =  33;const int mod = 10;const int dx[] = {1, -1, 0, 0};const int dy[] = {0, 0, -1, 1};const int Dis[] = {-1, 1, -5, 5};const double inf = 0x3f3f3f3f;int n, m, k;int ans;char g[maxn][maxn][maxn];bool vis[maxn][maxn][maxn];struct point{//标记每个点的三维坐标及从起点到达该点需要多长时间    int l, r, c;    int num;};bool judge(int l, int r, int c){    return r >= 0 && r < n && c >= 0 && c < m && l >= 0 && l < k;//判断点是否越界}int bfs(point beg){    queue<point> que;    que.push(beg);    vis[beg.l][beg.r][beg.c] = true;//标记某个位置是否访问过    int rr, cc;    while(!que.empty()){        point now = que.front(); que.pop();        int l = now.l, r = now.r, c = now.c;//        cout << l << " " << r << " " << c << " " << now.num << " ** " << g[l][r][c] << endl;        if(g[l][r][c] == 'E'){//到达终点,返回时间            return now.num;        }        for(int i = 0; i < 4; ++i){//从当前点向前后左右移动            rr = r + dx[i]; cc = c + dy[i];            if(judge(l, rr, cc) && !vis[l][rr][cc] && g[l][rr][cc] != '#'){//该点未越界、未访问过且可以通行                point next;                next.r = rr; next.c = cc;                next.l = l; next.num = now.num + 1;//记录该点相关信息,加入队列中                que.push(next);                vis[l][rr][cc] = true;//标记该点已访问过            }        }        if(judge(l - 1, r, c) && !vis[l - 1][r][c] && g[l - 1][r][c] != '#'){//向上移动            point next;            next.r = r; next.c = c;            next.l = l - 1; next.num = now.num + 1;            que.push(next);            vis[l - 1][r][c] = true;        }        if(judge(l + 1, r, c) && !vis[l + 1][r][c] && g[l + 1][r][c] != '#'){//向下移动            point next;            next.r = r; next.c = c;            next.l = l + 1; next.num = now.num + 1;            que.push(next);            vis[l + 1][r][c] = true;        }    }    return -1;//若不可达,返回-1}int main(){    while(~scanf("%d%d%d", &k, &n, &m) && (k || n || m)){        point beg, aim;        for(int kk = 0; kk < k; ++kk){            getchar();            for(int i = 0; i < n; ++i){                for(int j = 0; j < m; ++j){                    scanf("%c", &g[kk][i][j]);                    if(g[kk][i][j] == 'S'){//记录起点信息                        beg.l = kk, beg.r = i, beg.c = j; beg.num = 0;                    }                }                getchar();            }        }        memset(vis, false, sizeof vis);        int ans = bfs(beg);//从起点开始广搜        if(ans == -1) printf("Trapped!\n");        else printf("Escaped in %d minute(s).\n", ans);    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝忘记登录密码了怎么办 手机换卡了微信怎么办 淘宝退款成功后收到货怎么办 没收到货退款商家不处理怎么办 没收到货申请退款卖家不处理怎么办 京东已收到货却不处理退款怎么办 货退了卖家不退款怎么办 淘宝退了货卖家不退款怎么办 手机淘宝不显示图片怎么办 京东申请退款卖家不处理怎么办 企业网银冻结了怎么办 农行k宝坏了怎么办 手机检测不到u盾怎么办 农行有k宝怎么办信用卡 k米怎么点不了怎么办 c1驾照被扣3分怎么办 淘宝账号被黑了怎么办 淘宝卖家号虚假交易违规怎么办 扣扣申诉成功后怎么办 微信二维码收款异常怎么办 国际包裹被退回去了怎么办 京东账号手机号换了怎么办 换手机号了淘宝账号怎么办 qq登录id密码忘记怎么办 iphone商店密码忘记了怎么办 淘宝账号被限制登入怎么办 手机换号码了qq登不上怎么办 换手机了qq登不上怎么办 微信帐号和密码错误怎么办 高考生忘记登录密码怎么办 高考生登录密码丢了怎么办 高考志愿登录密码忘了怎么办 电视声音和画面不同步怎么办 苹果5s不能开机怎么办 红米手机老是闪退怎么办 苹果7plus打字卡怎么办 手机总是出现无响应怎么办 手机淘宝怎么打不开了怎么办 淘宝买东西卖家不同意退货怎么办 苹果自带浏览器不能上网怎么办 淘宝账号买不了东西怎么办