求解皮亚诺曲线距离

【问题描述】

 皮亚诺曲线是一条平面内的曲线。
 下图给出了皮亚诺曲线的 1 阶情形,它是从左下角出发,经过一个 3 × 3 的方格中的每一个格子,最终到达右上角的一条曲线。

 下图给出了皮亚诺曲线的 2 阶情形,它是经过一个 32 × 32 的方格中的每一个格子的一条曲线。它是将 1 阶曲线的每个方格由 1 阶曲线替换而成。

 下图给出了皮亚诺曲线的 3 阶情形,它是经过一个 33 × 33 的方格中的每一个格子的一条曲线。它是将 2 阶曲线的每个方格由 1 阶曲线替换而成。

 皮亚诺曲线总是从左下角开始出发,最终到达右上角。

 我们将这些格子放到坐标系中,对于 k 阶皮亚诺曲线,左下角的坐标是(0, 0),右上角坐标是 (3k − 1, 3k − 1),右下角坐标是 (3k − 1, 0),左上角坐标是(0, 3k − 1)。

 给定 k 阶皮亚诺曲线上的两个点的坐标,请问这两个点之间,如果沿着皮亚诺曲线走,距离是多少?

【输入格式】

 输入的第一行包含一个正整数 k,皮亚诺曲线的阶数。第二行包含两个整数 x1, y1,表示第一个点的坐标。
 第三行包含两个整数 x2, y2,表示第二个点的坐标。

【输出格式】

 输出一个整数,表示给定的两个点之间的距离。

【样例输入】

1
0 0
2 2

【样例输出】

8

【样例输入】

2
0 2
0 3

【样例输出】

13

【评测用例规模与约定】

对于 30% 的评测用例,0 ≤ k ≤ 10。
对于 50% 的评测用例,0 ≤ k ≤ 20。
对于所有评测用例,0≤k≤100, 0≤x1,y1,x2,y2<3^k, x1,y1,x2,y2≤10^18。
数据保证答案不超过 10^18。

【思路】

 先计算每个点到左下角点的距离,接着相减;
 用分治法,将高阶的皮亚诺曲线分割成低一阶的皮亚诺曲线,需要确定终点在哪块区域,还要确定下起点的位置,每次dfs需要对起点变换下位置。

【代码】

 思路有,但是代码不太好写,隔了几天在看的时候,重写做了下,然后解决。
 注意下long long类型可能会溢出,需要无符号long long

#include<iostream>
#define endl '\n'
#define maxn 100+5
using namespace std;
typedef long long ll;
typedef unsigned long long ull; int n=2;
ull x1=0,y1=0;
ull x2=2,y2=2;//获取一阶曲线距离
int get_dis(const ull x, const ull y, int dir){if(dir==1){            //左下角为起点 if(x==0)         return y;else if(x==1)    return 5-y;else             return 6+y;}else if(dir==2){ //右上角为起点 if(x==0)         return 8-y;else if(x==1)  return 3+y;else            return 2-y;}else if(dir==3){  //右下角为起点 if(x==0)         return 6+y;else if(x==1)     return 5-y;else             return y;}else if(dir==4){    //左上角为起点 if(x==0)         return 2-y;else if(x==1)  return 3+y;else            return 8-y;}
}
//len为边长,dir设定起点位置,(x,y)确定终点坐标
ull dfs(ull x,ull y,ull len, int dir){if(len==3)  return get_dis(x,y,dir);//根据dir变换起点和点坐标if(dir==2){x=len-1-x;y=len-1-y;}else if(dir==3){x=len-1-x;}else if(dir==4){y=len-1-y;}//左下角为起点int nxd;ull nxl=len/3, dis;ull mx=x%nxl, my=y%nxl, dx=x/nxl, dy=y/nxl; if(dx==0){dis=dy*nxl*nxl;if(dy==0)      nxd=1;else if(dy==1) nxd=3;else         nxd=1;}else if(dx==1){dis=(5-dy)*nxl*nxl;if(dy==0)        nxd=4;else if(dy==1) nxd=2;else         nxd=4;}else{dis=(6+dy)*nxl*nxl;if(dy==0)       nxd=1;else if(dy==1) nxd=3;else         nxd=1;}return dis+dfs(mx, my, nxl, nxd);
}
int main(){cin>>n;cin>>x1>>y1;cin>>x2>>y2;ull len=1;for(int i=0;i<n;i++) len*=3;
//  cout<<len<<endl;ull dis1=dfs(x1,y1,len,1);ull dis2=dfs(x2,y2,len,1);ull ans=dis2-dis1;
//  cout<<dis1<<" "<<dis2<<" "<<ans<<endl;cout<<ans<<endl;return 0;
}

2021-5-3 感谢观看-


蓝桥-皮亚诺曲线距离相关推荐

  1. 蓝桥杯第十一届决赛真题之皮亚诺曲线距离

    蓝桥杯第十一届决赛真题之皮亚诺曲线距离python 借鉴了https://www.cnblogs.com/EchoZQN/p/14829144.html的做法 然而同样的想法,python代码提交之后 ...

  2. 2020年第十一届蓝桥杯决赛JAVA B G题“皮亚诺曲线距离“

    2020年第十一届蓝桥杯决赛JAVA B G题"皮亚诺曲线距离" 2020国赛 JAVA B组 个人题解目录 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 ...

  3. 蓝桥杯【第十一届】【决赛】F皮亚诺曲线距离 + G出租车

    题目地址 官网地址 F皮亚诺曲线距离 找规律的题目,应该有各种各样的方法来做 (代码写完才发现我的x,y和题目是反过来的qwq, 不过都一样) (顺带吐槽一下,为啥不用写高精度就能过,题目里只是要求答 ...

  4. 2020第十一届蓝桥杯国赛(决赛)C/C++ B组F题皮亚诺曲线距离题解

    F: 皮亚诺曲线距离 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 1 阶情形,它是从左下角出发,经过一个 3 × 3 的方格中的每一个格子,最终到达右上角的一条曲线. 下图给 ...

  5. 试题 历届真题 皮亚诺曲线距离【第十一届】【决赛】【C组】

    试题 历届真题 皮亚诺曲线距离[第十一届][决赛][C组] 提交此题   评测记录 资源限制 内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Pytho ...

  6. 蓝桥杯-皮亚诺曲线距离

    观察皮亚诺曲线,我们可以得到一下结论. 将整个图形分成九个区域,编号如下: 我们规定一号区域的方向为标准方向,则所有区域的方向为 1:x不翻转,y不翻转 2:x翻转,y不翻转 3:x不翻转,y不翻转 ...

  7. 第十一届蓝桥杯国赛 C++ B组 试题 F: 皮亚诺曲线距离 (C++代码)

    时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 1 阶情形,它是从左下角出发,经过一个 3×3 的方格中的每 ...

  8. 2020年第十一届蓝桥杯国赛—c++B组—试题F:皮亚诺曲线距离

    这道题我写了一个多小时,还是自己太菜了,两个样例都过了,三阶皮亚诺随便取了两个点,距离也是正确的,如果有大佬找到了我的问题,欢迎指正 以下是我的思路 思路 总体就是求出两个点到原点的距离,然后相减即可 ...

  9. 蓝桥杯国赛 皮亚诺曲线距离

    参考博客 题意: 题解: 这个很恶魔 本质好说就是找规律,但是贼难写.. 找了篇题解,做法就是大化小,将大阶化为成小阶,计算出离远点的距离...我感觉我是写不出来.. 挺秒的,要推公式估计要一阵子 代 ...

最新文章

  1. 几个表示“光”的概念
  2. macbook可以装linux,怎样给老旧的 MacBook 安装 Linux
  3. 深度学习笔记 第五门课 序列模型 第二周 自然语言处理与词嵌入
  4. 前端--3、JavaScript
  5. java简易日历程序报告_简单的日历小程序(java编写)
  6. springmvc限流解决方案
  7. html动态计算高度,透明半透明背景
  8. apt-get update出现404 Not Found
  9. HTML5——锚点链接
  10. 面试题:React中setState
  11. html5 双水波加载动画,逼真的HTML5 3D水波动画 可多视角浏览
  12. 联想服务器安装2019系统,联想支持的Win10 2019年10月更新(1909版本)的机型
  13. 360浏览器访问跨域问题
  14. ISO 3166-1 国家编码
  15. 【广东大学生网络攻防大赛-WriteUp(非官方)】Misc | 复合
  16. win10 java8 环境变量_win10下安装JDK8和环境变量配置
  17. linux每日命令(3):ln命令
  18. 从苹果创业神话看资本运营应集中优势兵力
  19. 百度大脑手写文字识别使用攻略
  20. openwrt-17.01.6 LEDE下载

热门文章

  1. 注塑模具的五大特点,你知道吗?
  2. 使用python语言编写常见的文本分类算法
  3. 实操:搭建前端LB负载均衡+keepalived并指定apiserver的vip
  4. ITIL® 4 Foundation 考试知识点
  5. 特立独行的留言,不跟风岁月静好
  6. ParallelismfortheMasses:MakingParallelComputingaccessib
  7. 五种划分vlan的方式
  8. 基于语音合成的实时语音合成:让语音通信更加实时
  9. cmd下使用cd命令
  10. LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告