NYOJ1100【WAJUEJI which home strong!】BFS+優先隊列

描述

在一個山溝裏,姐弟倆同時考上了大學。但由於家裏拮据,所以這並不是什麼好消息。父親對孩子說:我就是砸鍋賣鐵也要把你們姐倆供出來。 當時的姐姐已經決定放棄上學的機會。 沒想到第二天天還沒亮,弟弟就偷偷帶著幾件破衣服和幾個乾巴饅頭走了,在姐姐枕邊留下一個紙條: 姐,你別愁了,考上大學不容易,我出去打工供你。弟。 姐姐握著那張字條,趴在炕上,失聲痛哭。 那一年,弟弟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<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int divs[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
int vis[105][105];
int mp[105][105];
int m,n,sx,sy,ex,ey;
struct node
{
    int x,y;
    int cnt;
    friend bool operator < (const node &a,const node &b)
    {
        return a.cnt>b.cnt;
    }
};
int dfs()
{
    priority_queue<node>q;
    node now,tmp;
    now.x=sx;
    now.y=sy;
    now.cnt=0;
    vis[now.x][now.y]=1;
    q.push(now);
    while(!q.empty())
    {
        now=q.top();
        q.pop();
        if(now.x==ex&&now.y==ey)
            return now.cnt;
        for(int i=0; i<4; i++)
        {
            tmp.x=now.x+divs[i][0];
            tmp.y=now.y+divs[i][1];
            tmp.cnt=now.cnt;
            if(tmp.x>=0&&tmp.y>=0&&tmp.x<n&&tmp.y<m&&!vis[tmp.x][tmp.y]&&mp[tmp.x][tmp.y]!='#')
            {
                if(mp[tmp.x][tmp.y]!='l')
                    tmp.cnt=tmp.cnt+mp[tmp.x][tmp.y]-'A'+1;
                q.push(tmp);
                vis[tmp.x][tmp.y]=1;
            }
        }
    }
    return -1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);

        for(int i=0; i<n; i++)
        {
            getchar();
            for(int j=0; j<m; j++)
            {

                scanf("%c",&mp[i][j]);
                if(mp[i][j]=='s')
                    sx=i,sy=j;
                if(mp[i][j]=='l')
                    ex=i,ey=j;
            }
        }
        int res=dfs();
        printf("%d\n",res);
    }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章