题目

题目大意

一个三角形的网格图,三角形与其有共同边的三角形相连。

起点到所有终点的最短距离。


思考历程

数据看起来还挺大的,所以不是什么图论算法。

这显然是一个结论题。

什么结论?

然后我就开始推:

一个点(x,y)(x,y)(x,y),它可以到达(x,y−1)(x,y+1)(x,y-1)(x,y+1)(x,y−1)(x,y+1)。

如果yyy是奇数,那么可以到达(x+1,y+1)(x+1,y+1)(x+1,y+1),否则可以到达(x−1,y−1)(x-1,y-1)(x−1,y−1)

将其在平面直角坐标系中表示出来,得到一个很好看的图(懒得画了)。

感性地想出了一个式子,感觉上好像没什么问题,打了交上去。

结果60分……


正解

这个方法有很多。

假设起点是上面那个(反正边是双向的),现在它要往下走:

如果它是正三角形,意味着它可以直接往下走。

如果它是倒三角形,就将其向左或向右一个,那就是正三角形的情况了。

可以推推式子,求出它走最短距离到达终点那一行的左右边界。

所谓走最短距离,就是先往下走,然后向左或向右,继续向下……

如果终点在边界内,答案就是最短距离。否则走到终点那一行的左边界或右边界,然后左右移动到终点。

还有一种特别好的方法。

我们如果只考虑上下走,那么对于那两个点来说,不管怎样,一定会走它们层数之差的距离。

这是我们以(1,1)(1,1)(1,1)为端点的情况,那不妨考虑一下,将图旋转六十度,以(n,1)(n,1)(n,1)或(n,2n−1)(n,2n-1)(n,2n−1)为顶点。

所以我们只需要算出它们分别以三个顶点的层数之差,加起来,就是答案。

比较好理解,所以我的程序打的就是这种方法。


代码

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
int main(){
int n,m,sx,sy,sz;
scanf("%d%d%d%d",&n,&m,&sx,&sy);
sz=(sx*2-sy-1)/2+1,sy=(sy-1)/2+1;
int ansx,ansy,ans=2147483647;
for (int i=1;i<=m;++i){
int x,y,z,t;
scanf("%d%d",&x,&y);
t=abs(x-sx)+abs((y-1)/2+1-sy)+abs((x*2-y-1)/2+1-sz);
if (t<ans || t==ans && (x<ansx || x==ansx && y<ansy))
ansx=x,ansy=y,ans=t;
}
printf("%d %d\n%d",ansx,ansy,ans+1);
return 0;
}

总结

题目不要想得太复杂……

能用一个三角形来想的题目就不要傻傻地用平面直角坐标系来想……

最新文章

  1. 读取微博feed伪代码
  2. 从 Microsoft SQL Server 迁移到 Oracle
  3. HDU 3364 Lanterns 高斯消元
  4. BZOJ1401 : Hexagon
  5. Handler笔记
  6. CSS属性一览
  7. -_-#【Angular】工具函数
  8. vs2008 + OpenCV-2.1.0-win32-vs2008安装
  9. SDWebImage下载图片的使用
  10. centos下安装jenkins
  11. jQuery中getJSON跨域原理详解
  12. iOS11、iPhone X、Xcode9 适配
  13. ios 中的循环引用问题及解决
  14. 跟我一起学opencv 第四课之图像的基本操作
  15. 华为oj之字符串分割
  16. Elasticsearch&#160;Search&#160;APIs
  17. Xamarin Essentials教程磁力计Magnetometer
  18. 理解tcp顺序释放操作和tcp的半关闭
  19. 学习 Linux,302(混合环境): Samba 角色
  20. HDU - 1051 Wooden Sticks 贪心 动态规划

热门文章

  1. 简述MapReduce数据流
  2. 剑指offer——34之字打印二叉树
  3. maven-dependencyManagement和dependencies区别
  4. [每日一个小技巧] CentOS 下使用yum安装一类软件包
  5. Flutter 类似viewDidAppear 的任务处理
  6. Centos7 pxe
  7. Android studio 添加引用Module项目 与 设置Module项目的Libs的Jar在主项目里使用
  8. 关于 argc 和 argv
  9. excel破解工作簿与工作表保护
  10. ros多机系统