codevs 1024 一塔湖图 floyd 解题报告
来源:互联网 发布:淘宝网旗袍服饰 编辑:程序博客网 时间:2024/06/09 20:22
题目描述 Description
小松所在的PK大学校园又称作燕园,是一个十分美丽的校园。有博雅塔,未名湖,亚洲最大的高校图书馆,人称“一塔湖图”。但是由于燕园的历史比较悠久,所以很多的老房子都要不断地维修(就像故宫现在在维修一样),这导致了燕园中的一些路是禁止通行的。
十分有趣的是,整个燕园的形状是南北朝向的一个四边形,而燕园的建筑格局也十分有规则。你可以假设他被n条横向的路和m条纵向的路分割成了大大小小的很多块区域。禁止通行的那些路正好在两个相邻的交叉路口之间。小松十分想知道,他要从他宿舍所在的A路口到达图书馆所在的B路口需要多少时间(他只能沿着能够通行的道路行走,并假设小松走1单位长度需要1单位的时间)?你能帮助他吗?(不要误会小松如此勤奋要去图书馆看书,小松去图书馆的主要原因是那里是全校PPMM最多的地方)。
另外要说的是,燕园中还有很多的地方是湖。所以湖所占的区域也是不能通行的。
输入描述 Input Description
输入文件的第一行包含4个整数n(1≤n≤10),m(1≤m≤10),t(1≤t≤100),k(1≤k≤10)。分别表示燕园中有n条纵向的路和m条横向的路,t条不能通行的路,还有k个湖。接下来的一行有n个整数a1..an。ai(0≤ai≤100)表示从西往东第i条纵向向路离燕园最西端的距离;再接下来的一行有m个整数b1..bm。bi(0≤bi≤100)表示从南往北第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)。
注:路口(x,y)表示由西向东的第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
思路
好像最后一个数据有毒
我还不是很会!!
代码
#include<cstdio>#include<iostream>#include<cstring>#define M 15#define INF 9999999using 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]);}
- codevs 1024 一塔湖图 floyd 解题报告
- codevs 1079 回家 Floyd 解题报告
- codevs 1020 孪生蜘蛛 floyd 解题报告
- codevs 1009 产生数 Floyd 解题报告
- codevs 2602 最短路径问题 Floyd 解题报告
- codevs 2800 送外卖 floyd+状压DP 解题报告
- [CODEVS]数据结构系列 解题报告
- CODEVS 1022 覆盖 解题报告
- [codevs 1515]跳 【解题报告】
- Codevs 1251 括号 解题报告
- Codevs 1557 热浪 解题报告
- CodeVS 2370 LCA 解题报告
- codevs 1006 等差数列 解题报告
- 【codevs天梯&青铜Bronze】解题报告
- Codevs 1503 愚蠢的宠物 解题报告
- Codevs 1008 选数 解题报告
- 【解题报告】食物链[codevs 1074][rqnoj 455]
- 【解题报告】CodeVS 4600 程序自动分析
- Android Studio安装总结
- 监控软件
- 51单片机驱动数码管(LED)时的注意事项
- 洛谷 P1600 天天爱跑步
- IntelliJ IDEA中Mybatis报Invalid bound statement (not found)错误解决办法
- codevs 1024 一塔湖图 floyd 解题报告
- 对于请求中出现参数乱码的情况的几种解决方法
- float数据在内存中是怎么存储的
- PAT_乙级训练记录 (B1036)
- HDU6205 card card card
- RALL和智能指针
- 【Angular】新手入门(一)
- hdu1754 -- I Hate It(单节点更新)
- 教育学习总结