• 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!
    ");
            }
            else {
                printf("Escaped in %d minute(s).
    " , ans);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    php中session的运行机制
    Mysql5.5修改字符集
    java中用StringBuffer写文件换行
    DatabaseMetaData 获取mysql表和字段注释
    DatabaseMetaData 获取oracle字段注释
    常用的easyui使用方法
    定位div滚动条
    easyui edatagrid 触发编辑行回掉onEdit
    java 读取类内容给指定的方法追加内容
    JS中文转换(UTF-8),中文乱码解决办法,url传递中文乱码解决
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6081869.html
Copyright © 2020-2023  润新知