zoukankan      html  css  js  c++  java
  • poj2251 Dungeon Master 搜索BFS

    题目:
    三维迷宫题:
    分析:
    在二维迷宫上多了上下搜索,求最优解,用BFS做,用队列储存上一个搜索过的节点,
    在下一次搜索时把删除最先入队的那个就行,另外得储存上一次的坐标,可以直接把
    x,y,z坐标分别乘以10000,100,1就行(注意到数据不超过30),把它作为新元素加入到
    队首中,借助数组判断是否已经走过,可以节省大量时间

    #include <iostream>
    #include <cstring>
    #include <queue>
    #include <string>
    #include <cstdio>
    using namespace std;
    #define X 32
    bool use[X][X][X];
    string map[X][X];
    int l,c,r;
    int bx,by,bz;
    int bfs()
    {
    queue<int> p;
    queue<int> q;
    p.push(0);
    q.push(bx*10000+by*100+bz);
    while(!q.empty())
    {
    int x = q.front()/10000;//计算竖的坐标
    int y = (q.front()000)/100;//计算纵坐标
    int z = q.front()P;//计算横坐标
    int ans = p.front();//提取标记已走过的分钟
    if(map[x][y][z]=='E')//遇到结束标记,即可返回答案
    return ans;
    else if(map[x][y][z]!='#')//没障碍物时(注意,此处不能为=='.',因为还有开始的'S')
    {
    if(x&&!use[x-1][y][z])
    { //往下走
    q.push((x-1)*10000+y*100+z);
    p.push(ans+1);
    use[x-1][y][z] = true;
    }
    if(y&&!use[x][y-1][z])
    { //往南走
    q.push(x*10000+(y-1)*100+z);
    p.push(ans+1);
    use[x][y-1][z] = true;
    }
    if(z&&!use[x][y][z-1])
    { //往西走
    q.push(x*10000+y*100+z-1);
    p.push(ans+1);
    use[x][y][z-1] = true;
    }
    if(x<l-1&&!use[x+1][y][z])
    { //往上走
    q.push((x+1)*10000+y*100+z);
    p.push(ans+1);
    use[x+1][y][z] = true;
    }
    if(y<r-1&&!use[x][y+1][z])
    { //往东走
    q.push(x*10000+(y+1)*100+z);
    p.push(ans+1);
    use[x][y+1][z] = true;
    }
    if(z<c-1&&!use[x][y][z+1])
    { //往北走
    q.push(x*10000+y*100+z+1);
    p.push(ans+1);
    use[x][y][z+1] = true;
    }
    }
    p.pop();
    q.pop();
    }
    return 0; //不能走到终点时(因为不可能起点终点在一起的,或者返回-1也行)
    }
    int main()
    {
    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    while(cin>>l>>r>>c,l||c||r)
    {
    memset(use,false,sizeof(use));
    int flag = 0;
    for(int i=0;i<l;i++)
    for(int j=0;j<r;j++)
    {
    cin>>map[i][j];
    int len = map[i][j].size();
    if(!flag) //平均来说此处也可节省不少时间
    for(int k=0;k<len;k++)
    if(map[i][j][k]=='S')
    {
    flag = 1;
    bx = i;
    by = j;
    bz = k;
    break;
    }
    }
    int ans = bfs();
    if(!ans)
    cout<<"Trapped!"<<endl;
    else
    printf("Escaped in %d minute(s).\n",ans);
    }

    return 0;
    }

  • 相关阅读:
    《编写高质量代码Web前端开发修炼之道》(读书笔记) windrainpy
    jQuery琐碎笔记 windrainpy
    【记录】事件冒泡和事件捕获 windrainpy
    JS比较容易迷惑的几个地方 windrainpy
    【转】成为顶级程序员的唯一途径! windrainpy
    jquery键盘事件 windrainpy
    【转】IE绝对定位元素神秘消失或被遮挡的解决 windrainpy
    简单算法
    HTTP的状态
    css的兼容问题
  • 原文地址:https://www.cnblogs.com/yejinru/p/2374692.html
Copyright © 2011-2022 走看看