zoukankan      html  css  js  c++  java
  • nyoj-1100 WAJUEJI which home strong!(搜索bfs+优先队列)


    WAJUEJI which home strong!
    时间限制:1000 ms  |  内存限制:65535 KB 
    难度:2

    描述 
    在一个山沟里,姐弟俩同时考上了大学。但由于家里拮据,所以这并不是什么好消息。父亲对孩子说:我就是砸锅卖铁也要把你们姐俩供出来。 当时的姐姐已经决定放弃上学的机会。 没想到第二天天还没亮,弟弟就偷偷带著几件破衣服和几个乾巴馒头走了,在姐姐枕边留下一个纸条: 姐,你别愁了,考上大学不容易,我出去打工供你。弟。 姐姐握著那张字条,趴在炕上,失声痛哭。 那一年,弟弟17岁,姐姐20岁。 姐姐用父亲满村子借的钱和弟弟在工地裏搬水泥挣的钱终於读到了大三。 一天姐姐正在寝室里看书,同学跑进来对姐姐说,有个老乡在找你。姐姐很纳闷,走出去后,远远地看见弟弟,穿著满身是水泥和沙子的工作服。姐姐说,你怎么和我同学说你是我老乡啊? 他笑著说,你看我穿的这样,说是你弟,你同学还不笑话你? 姐姐鼻子一酸,眼泪就落了下来。弟弟赶忙为姐姐擦掉眼泪,说:姐,你别哭,我这次来是想让你帮我打听一下,学挖掘机哪家强? 

    在你的帮助下,弟弟踏上了去蓝翔的路。

    那么问题就来了。

    输入第一个数T,T组测试数据。
     两个数 n, m; ( 0< n , m <= 100 ) 表示一个h行m列的二维地图。
     接下来n行每行m 个字符。
    ‘s’ 表示弟弟目前所在位置。
    ‘# ’表示此处为一座山。为了节省体力,不从此处通行。
     从‘A’-‘Z’表示各地的经济水平,对应1-26,路过对应字符的地区需要交对应的生活费。
    ‘l’表示蓝翔技校的所在地。
    s 与 l 均为小写字母。
     弟弟只能走四个方向。输出输出一个数表示弟弟到达蓝翔需要的生活费最小是多少。

     如果不能到达,输出 -1。

    样例输入

    3

    3 5
    #sVGF
    A##ZA
    lCDBC
    3 3
    sAB
    ABS
    ABl
    3 3
    s#B
    ###
    ABl

    样例输出

    48

    4

    -1

    广搜每一步的权值不相等所以要用优先队列

    #include<map>
    #include<queue>
    #include<math.h>
    #include<vector>
    #include<string>
    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #define inf 0x3f3f3f
    #define ll long long
    #define maxn 100005
    using namespace std;
    char d[105][105];
    int vis[105][105];
    int ans;
    int n,m;
    struct node
    {
        int x,y;
        int step;
        bool operator<(const node &a)const{
            return step>a.step;
        }
    };
    node T,S;
    bool judge(int x,int y)
    {
        if(x>=0&&y>=0&&x<n&&y<m)
            return true;
        return false;
    }
    void bfs()
    {
        priority_queue<node>q;
        while(!q.empty())
        {
            q.pop();
        }
        q.push(S);
        while(!q.empty())
        {
            T=q.top();
            q.pop();
            int x=T.x;
            int y=T.y;
            int step=T.step;
            if(d[x][y]=='l')
            {
                ans=min(ans,step);
            }
            if(judge(x-1,y)&&d[x-1][y]!='#'&&vis[x-1][y]==0)
            {
                T.x=x-1;
                T.y=y;
                if(d[x-1][y]!='l')
                {
                    T.step=step+(d[x-1][y]-'A'+1);
                    vis[x-1][y]=1;
                }
                else
                    T.step=step;
                q.push(T);
            }
            if(judge(x+1,y)&&d[x+1][y]!='#'&&vis[x+1][y]==0)
            {
                T.x=x+1;
                T.y=y;
                if(d[x+1][y]!='l')
                {
                    T.step=step+(d[x+1][y]-'A'+1);
                    vis[x+1][y]=1;
                }
                else
                    T.step=step;
                q.push(T);
            }
            if(judge(x,y-1)&&d[x][y-1]!='#'&&vis[x][y-1]==0)
            {
                T.x=x;
                T.y=y-1;
                if(d[x][y-1]!='l')
                {
                    T.step=step+(d[x][y-1]-'A'+1);
                    vis[x][y-1]=1;
                }
                else
                    T.step=step;
                q.push(T);
            }
            if(judge(x,y+1)&&d[x][y+1]!='#'&&vis[x][y+1]==0)
            {
                T.x=x;
                T.y=y+1;
                if(d[x][y+1]!='l')
                {
                    T.step=step+(d[x][y+1]-'A'+1);
                    vis[x][y+1]=1;
                }
                else
                    T.step=step;
                q.push(T);
            }
        }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            memset(vis,0,sizeof(vis));
            memset(d,0,sizeof(d));
            scanf("%d%d",&n,&m);
            for(int i=0; i<n; i++)
            {
                cin>>d[i];
                for(int j=0; j<m; j++)
                {
                    if(d[i][j]=='s')
                    {
                        S.x=i;
                        S.y=j;
                        S.step=0;
                        vis[i][j]=1;
                    }
                }
            }
            ans=inf;
            bfs();
            if(ans!=inf)
                cout<<ans<<endl;
            else
                cout<<-1<<endl;
        }
    }
    


  • 相关阅读:
    E寻宝(贪心)
    千万别点进来,点进来你就哭了(最短路,dijkstra)
    H小明买年糕(前缀和+二分)
    Charles破解
    Jmeter安装插件
    appium环境搭建
    SourceTree安装和教程
    Appium-desktopAppium-desktop 安装与入门使用
    appium终端安装
    Seleinum_CSS定位方式
  • 原文地址:https://www.cnblogs.com/da-mei/p/9053281.html
Copyright © 2011-2022 走看看