一塔湖图(codevs 1024)

题目描述 Description

小松所在的PK大学校园又称作燕园,是一个十分美丽的校园。有博雅塔,未名湖,亚洲最大的高校图书馆,人称“一塔湖图”。但是由于燕园的历史比较悠久,所以很多的老房子都要不断地维修(就像故宫现在在维修一样),这导致了燕园中的一些路是禁止通行的。

十分有趣的是,整个燕园的形状是南北朝向的一个四边形,而燕园的建筑格局也十分有规则。你可以假设他被n条横向的路和m条纵向的路分割成了大大小小的很多块区域。禁止通行的那些路正好在两个相邻的交叉路口之间。小松十分想知道,他要从他宿舍所在的A路口到达图书馆所在的B路口需要多少时间(他只能沿着能够通行的道路行走,并假设小松走1单位长度需要1单位的时间)?你能帮助他吗?(不要误会小松如此勤奋要去图书馆看书,小松去图书馆的主要原因是那里是全校PPMM最多的地方)。

另外要说的是,燕园中还有很多的地方是湖。所以湖所占的区域也是不能通行的。

输入描述 Input Description

输入文件的第一行包含4个整数n(1≤n10),m(1≤m10),t(1≤t100),k(1≤k10)。分别表示燕园中有n条纵向的路和m条横向的路,t条不能通行的路,还有k个湖。接下来的一行有n个整数a1..anai(0ai100)表示从西往东第i条纵向向路离燕园最西端的距离;再接下来的一行有m个整数b1..bmbi(0≤bi100)表示从南往北第i条横向路离燕园最南端的距离;再接下来k行,每行四个整数x1,x2,y1,y2表示由西向东的第x1条路到第x2条路和由南向北的第y1条路到第y2条路之间是一个湖。要注意的是湖的边缘是可以行走的,湖也可能有重叠,如果两个湖接壤的话,接壤的部分也是可以行走的;再接下来t行,每行4个整数x1,y1,x2,y2,表示路口(x1,y1)和(x2,y2)之间的路是静止通行的,你可以认定该两个路口一定是相邻的;最后一行包含4个整数x1,y1,x2,y2,表示小松所在的路口A(x1,y1)和图书馆所在的路口B(x2,y2)。

注:路口(xy)表示由西向东的第x条纵向路和由南向北的第y条横向路的交叉口。

输出描述 Output Description

输出包括一个整数,表示小松最少需要花费的时间。保证不会出现无解的情况。

样例输入 Sample Input

4 4 2 1

0 1 3 4

0 1 3 4

2 4 2 4

2 2 3 2

2 4 3 4

1 3 4 4

样例输出 Sample Output

11(样例有误,应为5)

#include<cstdio>
#include<iostream>
#include<cstring>
#define M 15
#define INF 9999999
using namespace std;
int map[M*M][M*M],x[M],y[M],cnt,n,m,t,k;
void build()
{
    memset(map,0x3f3f3f3f,sizeof(map));
    for(int i=1;i<=cnt;i++)
      map[i][i]=0;
    for(int i=1;i<=n;i++)//以map[i][j]为中心建图
      for(int j=1;j<=m;j++)
      {
          if(i>1)map[(j-1)*n+i][(j-1)*n+i-1]=x[i]-x[i-1];//向左
        if(j>1)map[(j-1)*n+i][(j-1-1)*n+i]=y[j]-y[j-1];//向上
        if(i<n)map[(j-1)*n+i][(j-1)*n+i+1]=x[i+1]-x[i];//向右
        if(j<m)map[(j-1)*n+i][(j-1+1)*n+i]=y[j+1]-y[j];//向下
      }
    for(int i=1;i<=t;i++)//处理不能走的路
    {
        int x1,y1,x2,y2;
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        map[(y1-1)*n+x1][(y2-1)*n+x2]=INF;
        map[(y2-1)*n+x2][(y1-1)*n+x1]=INF;
    }
    for(int l=1;l<=k;l++)//处理胡,注意边界可以走
    {
        int x1,y1,x2,y2;
        scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
        for(int i=x1;i<=x2-1;i++)//处理x方向的 只向右延伸
          for(int j=y1+1;j<=y2-1;j++)
          {
              map[(j-1)*n+i][(j-1)*n+i+1]=INF;
              map[(j-1)*n+i+1][(j-1)*n+i]=INF;
          }
        for(int j=y1;j<=y2-1;j++)//处理y方向的 只向下延伸
          for(int i=x1+1;i<=x2-1;i++)
          {
              map[(j-1)*n+i][j*n+i]=INF;
              map[j*n+i][(j-1)*n+i]=INF;
          }
    }
}
void floyed()
{
    for(int k=1;k<=cnt;k++)
      for(int i=1;i<=cnt;i++)
        for(int j=1;j<=cnt;j++)
          if(i!=j&&i!=k&&j!=k)
            map[i][j]=min(map[i][k]+map[k][j],map[i][j]);
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&t,&k);
    cnt=n*m;
    for(int i=1;i<=n;i++)
      scanf("%d",&x[i]);
    for(int i=1;i<=m;i++)
      scanf("%d",&y[i]);
    build();
    floyed();
    int x1,y1,x2,y2;
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    printf("%d",map[(y1-1)*n+x1][(y2-1)*n+x2]);
}

时间: 2024-07-31 06:58:43

一塔湖图(codevs 1024)的相关文章

codevs1024一塔湖图(丧心病狂的建图)

/* 丧心病狂的最短路 关键是建图 根据题目中给的路 拆出节点来 建图 (i,j) -->(j-1)*n+i 然后根据障碍 把死路 湖覆盖的dis改变成极大值 然后Floyd 然后 然后就没有然后了.... */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 99999999; using namespace std; int g[150][150],x[11],y[11],s

Linux磁盘配额

1.相关命令和文件 quota.quotacheck.quotaon.quotaoff.quotastats.quotasync.repquota.edquota.setquota /etc/fstab aquota.user.aquota.group 2.语法说明 (1)quotacheck 执行quotacheck指令,扫描挂入系统的分区,并在各分区的文件系统根目录下产生quota.user和quota.group文件,设置用户和群组的磁盘空间限制. 参数: -a 扫描在/etc/fstab

TexturePacker批处理python

TexturePacker版本 4.2.1 前言:因为水平有限,错误再所难免,望指正 1.安装TexturePacker Command Line Tool 1.1 Mac下安装 TexturePacker => Install Command Line Tool => Install 1.2 win下安装 必须配置环境变量. 2.TexturePacker命令说明(主要命令) 2.1 --texture-format --texture-format <id> Sets the

一幅画&lt;十六芒星盾&gt;---程序员or艺术家

画上是一面含有16个尖角的铜盾,这是我用程序算法生成的图像中最震撼的一幅.图像生成出来后,我看了好久,一边看一边想我的人生转向问题:我是不是该离开苦逼又屌丝的程序界,混入高端大气上档次的艺术圈? 说要进入艺术圈,只是提升逼格的话.其实我真正想的是:“靠,这画这么漂亮,要是能换成钱就好了.”虽说艺术是无价的,可艺术家是有价的.程序可以创造无限的财富,但程序员通常分不到多少.艺术虽高雅,但人是生活在世俗中的.我想的一个法子是:在某宝上开个网店,买电子艺术画,只买我用程序算法生成的图像.我需要将图像生

网络流 HDU 3605

建图   源点    ->   1024类人   ->   星球   ->     汇点 权             每类人数目       星球容量     星球容量 列举 0~1024  一位是1 那么和对应的星球建边 1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<queue> 5 #include<math.h> 6 7

四分树(Quadtrees)

[本博文非博主原创,思路与题目均摘自 刘汝佳<算法竞赛与入门经典(第2版)>] 四分树Quadtrees 一幅图有1024个点, 可以对图平均分成4块, 并且子图也可以再往下分, 直到一个子图表示一个点. f表示这块子图填满, p表示它还有4个子图, e表示没有子图(当然啦, 它也没有填满). 给定两个字符串(其实就是两幅图, 两棵树), 求把两图合并后的图的黑点数. Example Input 3 ppeeefpffeefe pefepeefe peeef peefe peeef peepe

移动平台纹理压缩格式选择

1)移动平台纹理压缩格式选择2)Unity 2018是否在Mali GPU上支持Alpha 8格式3)如何在Unity自带的Navmesh上获取地面高度4)ParticleSystem无法重新播放5)UI开发中按界面的打开顺序返回到上级面板的问题 Texture Q:在这之前了解过纹理压缩的相关知识和UWA的一些推荐方式.但还是有一点小的疑问,所以在这里再次提出来,希望得到解答. 在纹理压缩格式的选择上,如果Android选用ETC,iOS选用PVRTC,因为有2的次方(ETC1和PVRTC)长

利用filter实时切换big5和gb2312,以及gb2312的简繁体

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

俑烟汲的诿樟透磺勒秤窗mvus

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求