zoukankan      html  css  js  c++  java
  • HDU2425:Hiking Trip(BFS+优先队列)

    给出一个地图,地图有四种路面,经过每种路面花费的时间不同,问从起点到终点所花费的最少时间是多少

    把到各个点的花费存入队列中,然后弹出,即可得到最小 

    Sample Input
    4 6 1 2 10 T...TT TTT### TT.@#T ..###@ 0 1 3 0 4 6 1 2 2 T...TT TTT### TT.@#T ..###@ 0 1 3 0 2 2 5 1 3 T@ @. 0 0 1 1
     
    Sample Output
    Case 1: 14 Case 2: 8 Case 3: -1
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    int x,y,v1,v2,v3,b,n,m;
    int x1,x2,y1,y2;
    int p[25][25];
    int vis[25][25];
    int v[5];
    int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
    struct node
    {
        int x,y,step;
        friend bool operator < (node a,node b)
        {
            return a.step > b.step;
        }
    };
    
    bool judge(int x,int y)
    {
        if(x < 0 || y < 0 || x >= n || y >= m || p[x][y] < 0 || vis[x][y])
            return false;
        return true;
    }
    
    int work()
    {
        priority_queue<node>que;
        node a,b;
        a.x=x1;
        a.y=y1;
        a.step = 0;
        que.push(a);
        memset(vis,0,sizeof(vis));
        vis[x1][y1] = 1;
        while(!que.empty())
        {
            a = que.top();
            que.pop();
            if(a.x == x2 && a.y == y2)
                    return a.step;
            for(int i = 0;i < 4;i++)
            {
                b = a;
                b.x += dir[i][0];
                b.y += dir[i][1];
                if(!judge(b.x,b.y))
                    continue;
                b.step  += v[p[b.x][b.y]];
                vis[b.x][b.y] = 1;
                que.push(b);
            }
        }
        return -1;
    }
    
    int main()
    {
        int i,j,cas = 1;
        char s[1000];
        while(~scanf("%d%d",&n,&m))
        {
            scanf("%d%d%d",&v[3],&v[2],&v[1]);
            for(i = 0; i < n; i++)
            {
                scanf("%s",s);
                for(j = 0;s[j]; j++)
                {
                    if(s[j]=='T') p[i][j] = 1;
                    else if(s[j] == '.') p[i][j] = 2;
                    else if(s[j] == '#') p[i][j] = 3;
                    else if(s[j] == '@') p[i][j] = -1;
                }
            }
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            int ans = work();
            printf("Case %d: %d
    ",cas++,ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    【字符串/广搜】P1032 字串变换
    【动态规划】P1541 乌龟棋
    【动态规划/递归】(团队内部比赛试题)T134293 T2.货币系统问题
    Redis-事务
    Redis-Pipeline
    Redis-通过前缀获取所有key
    Spring 三级缓存
    TopK_LRU_归并

    如何从一亿个数组里找出最大的十个
  • 原文地址:https://www.cnblogs.com/Przz/p/5409827.html
Copyright © 2011-2022 走看看