• Hrbust-1621 迷宫问题II(广搜+优先队列)


    这里写图片描述
    数字代表怪兽,求起点到终点的最少时间。
    既然这样就是个裸的广搜,每次走路的代价从1变成打怪需要时间+1(上一步到这里需要的时间)就好了。。。其他照旧,用于广搜的队列变成优先队列,也就是本来是按先后入队列的顺序搜索,变成了每次找到最小花费时间往后搜索,不过感觉很奇怪的是,这样一来一些次要路径在正确路径的时间增长后也会被拿出来继续搜索,啊不过这不就是搜索的过程吗,未用优先队列的搜索将不是最少时间,而是最短路径,打的怪少用的时间多,用了优先队列后将多次拿出最小花费时间来继续搜索,最终我们需要的结果即是队列中花费最小的那条路径,取出保证了其时间小,到达点是W(出口)表示以此最小时间找到了终点。

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    int walkx[]= {1,-1,0,0};
    int walky[]= {0,0,1,-1};
    struct point
    {
        int x,y,ans;
        bool operator <(const point &a)const
        {
            return ans>a.ans;
        }
    } st,ed;
    char ma[208][208];
    bool vis[208][208];
    int main()
    {
        int t,n,m;
        scanf("%d",&t);
        while(t--)
        {
            memset(vis,false,sizeof(vis));
            scanf("%d%d",&n,&m);
            getchar();
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                {
                    scanf("%c",&ma[i][j]);
                    if(ma[i][j]=='Z')st.x=i,st.y=j;
                    if(ma[i][j]=='W')ed.x=i,ed.y=j;
                }
                getchar();
            }
            priority_queue<point>q;
            while(!q.empty())q.pop();
            int ans=0x7fffffff;
            vis[st.x][st.y]=true;
            st.ans=0;
            q.push(st);
            bool flag=false;
            while(!q.empty())
            {
                point tmp,top=q.top();
                q.pop();
                for(int i=0; i<4; i++)
                {
                    tmp.x=top.x+walkx[i];
                    tmp.y=top.y+walky[i];
                    tmp.ans=top.ans+1;
                    if(ma[tmp.x][tmp.y]>='0'&&ma[tmp.x][tmp.y]<='9') tmp.ans+=ma[tmp.x][tmp.y]-'0';
                    if(ma[tmp.x][tmp.y]=='W')
                    {
                        ans=tmp.ans;
                        flag=true;
                        break;
                    }
                    if(tmp.x>=0&&tmp.y>=0&&tmp.x<n&&tmp.y<m&&!vis[tmp.x][tmp.y]&&ma[tmp.x][tmp.y]!='#')
                    {
                        vis[tmp.x][tmp.y]=true;
                        q.push(tmp);
                    }
                }
                if(flag)break;
            }
            if(ans==0x7fffffff)printf("IMPOSSIBLE
    ");
            else printf("%d
    ",ans);
        }
    }
    
  • 相关阅读:
    网上流行的学生选课相关的50个常用sql语句
    the interview questions of sql server
    ASP.NET 之 Chart Control for .Net Framework
    SQL Server之纵表与横表互转
    ASP.NET控件之RadioButtonList
    SQL Server通过钉钉机器人直接发送消息
    使用AMO对象,更改款属性名称
    常用MDX函数
    Excel 插入图片
    Sql Server 2008查询数据库中各表记录行数
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11794308.html
Copyright © 2020-2023  润新知