• hdu 杭电 1242 Rescue 果枫


    题意:从a开始,找到r所需的时间(r可以有多个,找到第一个输出所需的时间即可),‘#’是墙不可走,

          经过‘.’时间加1,经过‘x’时间加2.

    解法:广搜,使用优先队列,队列中的首元素都为队列中step最小的一个元素。

    注意:r可以有多个。

    ac代码:

    View Code
    #include<iostream>
    #include<queue>
    using namespace std;
    
    const int M=200+10;
    char map[M][M];//地图
    int use[M][M];//用作标记
    int nn[4][2]={0,1,-1,0,0,-1,1,0};//方向向量:左,上,右,下
    
    
    struct node
    {
        int i;
        int j;
        int step;
        const bool operator <(const node &old)const//使用优先队列,此处重载小于号
        {
            return step>old.step;//队列中的元素按setp的值升序排列
        }
    };
    
    
    int  outside(int x,int y,int n,int m)//判断是否出界
    {
        if(x>0&&x<=n&&y>0&&y<=m)
            return 1;
        return 0;
    }
    
    
    int main()
    {
    
    
        struct node temp;
        priority_queue<struct node> q;
        int n,m;
        while(cin>>n>>m)
        {
    
            memset(use,0,sizeof(use));
            int i,j;
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                    cin>>map[i][j];
                    if(map[i][j]=='a')
                    {
                        temp.i=i;
                        temp.j=j;
                        temp.step=0;
                    }
                }
            }
    
            q.push(temp);
            map[temp.i][temp.j]='#';
            int foat=1;
            while(!q.empty()&&foat)
            {
                for(i=0;i<4;i++)
                {
                    temp.i=q.top().i+nn[i][0];
                    temp.j=q.top().j+nn[i][1];
                    if(outside(temp.i,temp.j,n,m)&&map[temp.i][temp.j]!='#')
                    {
    
                        if(map[temp.i][temp.j]=='x')
                            temp.step=q.top().step+2;
                        else
                            temp.step=q.top().step+1;
                        q.push(temp);
                        if(map[temp.i][temp.j]=='r')
                        {
                            foat=0;
                            break;
                        }
                        map[temp.i][temp.j]='#';
                    }
                }
                q.pop();
            }
    
            if(!foat)
                cout<<temp.step<<endl;
            else
                cout<<"Poor ANGEL has to stay in the prison all his life." <<endl;
            while(!q.empty())
                q.pop();
        }
        return 0;
    }
    
    
    
    峰注:不明白请留言。
  • 相关阅读:
    一个泛型栈类(GenericStack)
    Google Maps API v2初探
    浅谈工作中celery与Redis遇到的一些问题 PTSD
    python PTSD
    77%的Linux运维都不懂的内核问题
    教程 | Linux常用命令大全
    分布式架构系列: 负载均衡技术详解
    10大Python开源项目推荐(Github平均star2135)
    你必须学写 Python 装饰器的五个理由
    五分钟搞定 Linux 文档全部知识,就看这篇文章
  • 原文地址:https://www.cnblogs.com/zgfailmr/p/2665891.html
Copyright © 2020-2023  润新知