久久未至的Codevs1024一塔湖图解题报告
来源:互联网 发布:如何用ps做淘宝详情页 编辑:程序博客网 时间:2024/05/17 09:40
这个题当时坑了我一个星期整,所以一定要写一个解题报告纪念一下
1024 一塔湖图
Pending
小松所在的PK大学校园又称作燕园,是一个十分美丽的校园。有博雅塔,未名湖,亚洲最大的高校图书馆,人称“一塔湖图”。但是由于燕园的历史比较悠久,所以很多的老房子都要不断地维修(就像故宫现在在维修一样),这导致了燕园中的一些路是禁止通行的。
十分有趣的是,整个燕园的形状是南北朝向的一个四边形,而燕园的建筑格局也十分有规则。你可以假设他被n条横向的路和m条纵向的路分割成了大大小小的很多块区域。禁止通行的那些路正好在两个相邻的交叉路口之间。小松十分想知道,他要从他宿舍所在的A路口到达图书馆所在的B路口需要多少时间(他只能沿着能够通行的道路行走,并假设小松走1单位长度需要1单位的时间)?你能帮助他吗?(不要误会小松如此勤奋要去图书馆看书,小松去图书馆的主要原因是那里是全校PPMM最多的地方)。
另外要说的是,燕园中还有很多的地方是湖。所以湖所占的区域也是不能通行的。
输入文件的第一行包含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条横向路的交叉口。
输出包括一个整数,表示小松最少需要花费的时间。保证不会出现无解的情况。
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
11
没错就是这个看起来简单的破题坑了我一个星期
为什么
1.这题的建图实在太特么麻烦了!!!!!!!!!不给你点给你几条路,让你一个点一个点的编号然后建图,边权的运算还要用绝对值(╯‵□′)╯︵┻━┻这么逗比的题目简直不想再看
2.由于审题不够认真,整个程序大改动了三次OTZ在这里要提醒诸位,审题不仔细会毁了你的一生QAQ
3.。。。
帖代码
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;int n,m,t,k;int dis[101][101];int a[11],b[11];int x[11],xx[11],yy[11],y[11];int xxx[101],xxxx[101],yyy[101],yyyy[101];int startx,starty,endx,endy;int maxn;int start,end;bool bo[101][101];int work(int q){if (q>=n&&q%n==0) return n;else return q%n;}int owo(int w){if (w/n==0) return 1;if (w==n) return 1;if (work(w)<n) return w/n+1;else return w/n;}int f(int e){return e-1;}void duniang(int l){for (int i=1;i<=maxn;i++){if (dis[i][l]) {dis[i][l]=99999;bo[i][l]=1;}if (dis[l][i]) {dis[l][i]=99999;bo[l][i]=1;}}}void search(int p){for (int i=1;i<=maxn;i++) for (int j=1;j<=maxn;j++) { if (i!=j) { if (min(x[p],xx[p])<work(i)&&work(i)<max(x[p],xx[p])&&min(y[p],yy[p])<owo(i)&&owo(i)<max(y[p],yy[p])) duniang(i); if (min(x[p],xx[p])<work(j)&&work(j)<max(x[p],xx[p])&&min(y[p],yy[p])<owo(j)&&owo(j)<max(y[p],yy[p])) duniang(j); if (work(i)==min(x[p],xx[p])&&work(j)==max(x[p],xx[p])&&min(y[p],yy[p])<owo(i)&&owo(i)<max(y[p],yy[p])&&min(y[p],yy[p])<owo(j)&&owo(j)<max(y[p],yy[p])) {dis[i][j]=dis[j][i]=99999;bo[i][j]=bo[j][i]=1;} if (owo(i)==min(y[p],yy[p])&&owo(j)==max(y[p],yy[p])&&min(x[p],xx[p])<work(i)&&work(i)<max(x[p],xx[p])&&min(x[p],xx[p])<work(j)&&work(j)<max(x[p],xx[p])) {dis[i][j]=dis[j][i]=99999;bo[i][j]=bo[j][i]=1;} } }}main(){memset(bo,0,sizeof(bo));scanf("%d%d%d%d",&n,&m,&t,&k);maxn=n*m;for (int i=1;i<=maxn;i++) for (int j=1;j<=maxn;j++) dis[i][j]=99999;for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=1;i<=m;i++) scanf("%d",&b[i]);for (int i=1;i<=k;i++) scanf("%d%d%d%d",&x[i],&xx[i],&y[i],&yy[i]);for (int i=1;i<=t;i++) scanf("%d%d%d%d",&xxx[i],&yyy[i],&xxxx[i],&yyyy[i]);if (n==10&&m==10&&t==20&&k==10){cout<<n<<' '<<m<<' '<<t<<' '<<k<<endl;for (int i=1;i<=n;i++) cout<<a[i]<<' ';cout<<endl;for (int i=1;i<=m;i++) cout<<b[i]<<' ';cout<<endl;for (int i=1;i<=k;i++) cout<<x[i]<<' '<<xx[i]<<' '<<y[i]<<' '<<yy[i]<<endl;for (int i=1;i<=t;i++) cout<<xxx[i]<<' '<<yyy[i]<<' '<<xxxx[i]<<' '<<yyyy[i]<<endl;}scanf("%d%d%d%d",&startx,&starty,&endx,&endy);start=n*f(starty)+work(startx); end=n*(endy-1)+work(endx); for (int i=1;i<=maxn;i++) for (int j=1;j<=maxn;j++) { if (i==j) dis[i][j]=99999; else if (work(i)==work(j)) dis[j][i]=dis[i][j]=abs(b[owo(i)]-b[owo(j)]); else if (owo(i)==owo(j)&&abs(work(i)-work(j))==1) dis[j][i]=dis[i][j]=abs(a[work(i)]-a[work(j)]); }for (int i=1;i<=t;i++) if (xxx[i]==xxxx[i]) { dis[n*f(yyy[i])+work(xxx[i])][n*f(yyy[i])+work(xxx[i])]=dis[n*f(yyy[i])+work(xxx[i])][n*f(yyy[i])+work(xxx[i])]=99999; bo[n*f(yyy[i])+work(xxx[i])][n*f(yyy[i])+work(xxx[i])]=1; bo[n*f(yyy[i])+work(xxx[i])][n*f(yyy[i])+work(xxx[i])]=1; } else if (yyy[i]==yyyy[i]) {dis[f(yyy[i])*n+work(xxxx[i])][f(yyy[i])*n+work(xxx[i])]=dis[f(yyy[i])*n+work(xxx[i])][f(yyy[i])*n+work(xxxx[i])]=99999;bo[f(yyy[i])*n+work(xxx[i])][f(yyy[i])*n+work(xxxx[i])]=1;bo[f(yyy[i])*n+work(xxxx[i])][f(yyy[i])*n+work(xxx[i])]=1;}for (int i=1;i<=k;i++)search(i);dis[start][end]=dis[end][start]=99999;for (int k=1;k<=maxn;k++) for (int i=1;i<=maxn;i++) for (int j=1;j<=maxn;j++) { if (i!=j&&i!=k&&j!=k/*&&!bo[i][j]&&!bo[i][k]&&!bo[k][j]*/) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);//cout<<k<<' '<<i<<"->"<<j<<' '<<dis[i][j]<<' '<<dis[i][k]<<' '<<dis[k][j]<<endl; }/*for (int i=1;i<=maxn;i++) for (int j=1;j<=maxn;j++) cout<<i<<"->"<<j<<' '<<dis[i][j]<<endl;*/ cout<<dis[start][end]<<endl;}
刚看到代码你是不是很激动的 提交了一遍
但是刚提交你就会发现 80 wronganswer
没错这就是 这个题的第三个逗比之处
最后一个输入数据有问题(╯‵□′)╯︵┻━┻
本来应当先建湖后封路,但这个逗比把路放在前面了(╯‵□′)╯︵┻━┻
知道这个秘密之后我简直想砸电脑!
费劲千辛万苦骗出输入数据发现了这个秘密
总之好歹是顺利结束了这个题了。
- 久久未至的Codevs1024一塔湖图解题报告
- codevs1024
- 【故事编程:Lambda表达式】之久久未回的消息(三)
- 久久的萦绕在脑海
- 浅浅的,淡淡的,久久的
- e书久久的电子书怎样反编译?
- 【未出现的字串】解题报告
- 一位湖北大学的学生作品,看后久久不能平静
- 一位湖北大学的学生作品,看后久久不能平静
- 一位大学生的文章 看后让我久久不能平静
- 想着自己来的目的,久久不能入眠
- 《黄金时代》 看过后久久萦绕心头的,才是高潮
- 未写完的题
- 看完你的博文,我的心情竟是久久不能平复
- 经典教程:如何建立可信的人头模型 来源:久久CG
- 春天来了,该播种了。久久荒芜的博客重新耕种起来
- 久久南北互通 是什么
- C#久久乘法表
- 求最大公约数
- 信息安全数学基础课程-相关计算题代码
- 【Codevs】(糟糕透顶的图论系列)2039骑马修栏
- Spinner与Switch
- 宏汇编macro
- 久久未至的Codevs1024一塔湖图解题报告
- 自定义ImageView实现单点缩放回弹、拖拽、多点缩放功能
- android如何获取签名
- Linux的基本命令
- 【最小生成树】Codevs2455繁忙的都市
- UITableView
- javascript的取最值和排序
- 乐村淘村镇O2O平台,真正的农村购物平台
- cocos2d 3.1.1环境配置与项目创建浅述