• POJ 2251 Dungeon Master(三维广搜——搜索方向(东,南,西,北,上,下))


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

    题意:有l层平面,每个平面的大小是r*c,问从S到E最小的花费

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #include <algorithm>
    #define mem(a,b) memset(a,b,sizeof(a));
    using namespace std;
    #define INF 0x3f3f3f3f
    typedef long long ll;
    int dir[4][2] = {0,1,0,-1,1,0,-1,0};
    const int maxn = 50005;
    int l,r,c,vis[40][40][40],ans;
    char s[40][40][40];
    bool flag;
    struct node {
        int x,y,z,val;//val为起点到该点的花费
        node(int xx,int yy,int zz,int vall):x(xx),y(yy),z(zz),val(vall){};
    };
    void bfs(int ii,int jj,int kk) {//(z,x,y)
        queue<node>q;
        q.push(node(jj,kk,ii,0));//(x,y,z)
        vis[ii][jj][kk] = 1;
        while(!q.empty()) {
            node temp = q.front();
            q.pop();
            int fx = temp.x,fy=temp.y,fz =temp.z,fv = temp.val;
            if(s[fz][fx][fy] == 'E') {
                flag = 1;
                ans = fv;
                break;
            }
            for(int i = 0; i < 4; i++) {//东南西北四个方向
                fx = temp.x + dir[i][0],fy = temp.y + dir[i][1],fz = temp.z,fv = temp.val;
                if(fx >=0 && fx < r && fy >=0 && fy < c && (s[fz][fx][fy] == '.' || s[fz][fx][fy] == 'E') && !vis[fz][fx][fy])
                {
                    vis[fz][fx][fy] = 1;
                    q.push(node(fx,fy,fz,fv+1));//每走一步,花费加1
                }
            }
            fx = temp.x, fy = temp.y,fv = temp.val;
            fz = temp.z+1;
            if(fz >=0 && fz < l&&(s[fz][fx][fy] == '.' || s[fz][fx][fy] == 'E')&& !vis[fz][fx][fy]) {//向上
                vis[fz][fx][fy] = 1;
                q.push(node(fx,fy,fz,fv+1));
            }
            fz = temp.z-1;
            if(fz >=0 && fz < l&&(s[fz][fx][fy] == '.' || s[fz][fx][fy] == 'E') && !vis[fz][fx][fy]) {//向下
                vis[fz][fx][fy] = 1;
                q.push(node(fx,fy,fz,fv+1));
            }
        }
    }
    int main()
    {
    
        while(cin >> l >> r >> c &&l&&r&&c) {
            mem(vis,0);
            flag = 0;
            for(int i = 0; i < l; i++) {
                for(int j = 0 ; j < r; j++) {
                    cin >> s[i][j];
                }
            }
            for(int i = 0; i < l; i++) {
                for(int j = 0; j < r; j++) {
                    for(int k = 0; k < c; k++) {
                        if(s[i][j][k] == 'S'){//找到起点开始搜
                            bfs(i,j,k);
                            break;
                        }
                    }
                }
            }
            if(flag) cout << "Escaped in "<< ans << " minute(s)." <<endl;
            else cout << "Trapped!" << endl;
        }
        return 0;
    }
  • 相关阅读:
    关于使用easyui dataGrid遇到的小bug问题
    构造带清除按钮的combo
    ajax方式提交数据时“+”的处理
    JavaScript call方法
    stackoverflow上的一个关于传递类对象的问题
    经典回溯算法(八皇后问题)
    c++构造函数(初始化式)被忽略的东西
    跟着<<C++Primer 学set容器>>
    排序算法(内部排序)总结
    hosts文件无法修改的问题解决方案
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/11353392.html
Copyright © 2020-2023  润新知