• 积水的城市 hiho[Offer收割]编程练习赛4


    题目2 : 积水的城市

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    如下图所示,某市市区由M条南北向的大街和N条东西向的道路组成。其中由北向南第i条路和第i+1条路之间的距离是Bi (1 <= i < N),由西向东第i条街和第i+1条街之间的距离是Ai (1 <= i < M)。

    小Ho现在位于第x条路和第y条街的交叉口,他的目的地是第p条路和第q条街的交叉口。由于连日降雨,城市中有K个交叉口积水太深不能通行。小Ho想知道到达目的地的最短路径的长度是多少。

    输入

    第一行包含两个整数N和M。(1 <= N, M <= 500)  

    第二行包含N-1个整数, B1, B2, B3, ... BN-1。(1 <= Bi <= 100)  

    第三行包含M-1个整数, A1, A2, A3, ... AM-1。(1 <= Ai <= 100)  

    第四行包含一个整数K,表示积水的交叉口的数目。 (0 <= K <= 30)  

    以下K行每行包含2个整数,X和Y,表示第X条路和第Y条街的交叉口积水。(1 <= X <= N, 1 <= Y <= M)  

    第K+5行包含一个整数Q,表示询问的数目。 (1 <= Q <= 10)  

    以下Q行每行包含4个整数x, y, p, q,表示小Ho的起止点。起止点保证不在积水的交叉口处。  (1 <= x, p <= N, 1 <= y, q <= M)

    输出

    对于每组询问,输出最短路的长度。如果小Ho不能到达目的地,输出-1。

    样例输入
    4 5  
    2 4 1  
    3 3 3 2  
    3  
    1 3  
    2 3  
    3 2  
    1  
    1 2 2 4  
    样例输出
    24


    只能说刷题真好,之前模糊的知识,坐上几道题哦了。以后多刷题,专注点。少走神、、、
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <queue>
    using namespace std;
    const int maxn = 200010;
    typedef long long ll;
    const int inf =0x3f3f3f3f;
    int maze[505][505],d[505][505],nn[501],b[505],n,m;
    struct node{
        int d,x,y;
        //node (int dd,int xx,int yy):x(xx), y(yy), d(dd) {}
        bool operator < (const node& a) const {
            return d>a.d;
        }
    };
    int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
    int dis(int x,int y,int i){
        if(i==0)return b[y];
        if(i==1)return nn[x];
        if(i==2)return b[y-1];
        return nn[x-1];
    }
    void bfs(int s,int t){
        priority_queue<node> que;
        que.push(node{0,s,t});
        d[s][t]=0;
        while(!que.empty()){
            node q= que.top(); que.pop();
            int x=q.x,y=q.y,dd=q.d;
            //printf("%d %d %d 
    ",x,y,dd);
            if(d[x][y]!=dd)  continue;
    
            for(int i=0;i<4;i++){
                int nx=x+dx[i],ny=y+dy[i];
                //printf("%d %d
    ",nx,ny);
                if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!maze[nx][ny]&&(d[nx][ny]>d[x][y]+dis(x,y,i))){
                    d[nx][ny]=d[x][y]+dis(x,y,i);
                    que.push(node{d[nx][ny],nx,ny});
                    //printf("%d %d %d 
    ",nx,ny,d[nx][ny]);
                }
            }
        }
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        scanf("%d%d",&n,&m);
        for(int i=1;i<n;i++)   scanf("%d",nn+i);
        for(int i=1;i<m;i++)   scanf("%d",b+i);
        int q,k,x,y;
    
        scanf("%d",&k);
        for(int i=0;i<k;i++){
            scanf("%d%d",&x,&y);
            maze[x][y]=1;
        }
        scanf("%d",&q);
        while(q--){
            memset(d,0x3f,sizeof(d));
            int x,y,s,t;
            scanf("%d%d%d%d",&x,&y,&s,&t);
            bfs(x,y);
            if(d[s][t]==inf)   printf("-1
    ");
            else  printf("%d
    ",d[s][t]);
        }
    }
  • 相关阅读:
    【华为云技术分享】使用keil5打开GD32F450i的MDK项目出现的问题以及J-Link无法烧录程序对应的解决方案
    【华为云技术分享】不为人知的稠密特征加入CTR预估模型的方法
    205. 判断两个字符串的模式是否相同 Isomorphic Strings
    541. 反转字符串2 Reverse String II
    插入排序,二分查找插入排序,使用二叉树的插入排序
    二分查找,求mid值的类型溢出问题
    二叉搜索树类的C#实现
    二叉搜索树,删除节点
    二叉搜索树的前驱节点和后继节点
    438. 匹配字符串(顺序不同但个数相同的字符串) Find All Anagrams in a String
  • 原文地址:https://www.cnblogs.com/acmtime/p/5746611.html
Copyright © 2020-2023  润新知