F: 皮亚诺曲线距离

【问题描述】
皮亚诺曲线是一条平面内的曲线。
下图给出了皮亚诺曲线的 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 < 3k, x1, y1, x2, y2 ≤ 1018
数据保证答案不超过 1018

题解

这道题比赛时看了下感觉很难,而且隔壁做很久都没出来,便果断放弃,下来后看了下其实感觉也不是很难。你可以把问题分解为分别求从左下角的点到第一个点和第二个点的距离,再把距离相减。通过calc函数计算距离,计算时把整幅图看做是由9个较小的方格组成的,看看从左下角的方格到该点所在的方格所需要走几个方格,再乘以每个方格内部曲线的长度,接着递归调用函数再求在小方格中到该点所在更小的方格要走几格,最后把各步求得的结果加起来就好了。至于其中有的小方格方向和1阶的方向不太一样,其实它就是做了个对称变换,你把它变换回去就可以了,可以不用再分别判断。代码不保证完全正确,反正我试了下没发现问题,但我想如果输入的坐标值太大,有可能会超过范围而出错。

#include<iostream>
#include<cmath>
using namespace std;
long long calc(long long x,long long y,int level,int type)
{//x,y start from 0, total size:3^level*3^level,type=0-3:起点在左下角,左上角,右上角,右下角if(level==0)return 0;long long int step,base=pow(9,level-1);if(type==1)y=pow(3,level)-1-y;else if(type==2)x=pow(3,level)-1-x,y=pow(3,level)-1-y;else if(type==3)x=pow(3,level)-1-x;if(x<pow(3,level-1)){if(y<pow(3,level-1)){step=0*base;step+=calc(x,y,level-1,0);}else if(y<pow(3,level-1)*2){step=1*base;step+=calc(x,y-pow(3,level-1),level-1,3);}else{step=2*base;step+=calc(x,y-pow(3,level-1)*2,level-1,0);}}else if(x<pow(3,level-1)*2){if(y<pow(3,level-1)){step=5*base;step+=calc(x-pow(3,level-1),y,level-1,1);}else if(y<pow(3,level-1)*2){step=4*base;step+=calc(x-pow(3,level-1),y-pow(3,level-1),level-1,2);}else{step=3*base;step+=calc(x-pow(3,level-1),y-pow(3,level-1)*2,level-1,1);}}else{if(y<pow(3,level-1)){step=6*base;step+=calc(x-2*pow(3,level-1),y,level-1,0);}else if(y<pow(3,level-1)*2){step=7*base;step+=calc(x-2*pow(3,level-1),y-pow(3,level-1),level-1,3);}else{step=8*base;step+=calc(x-2*pow(3,level-1),y-pow(3,level-1)*2,level-1,0);}}//cout<<x<<' '<<y<<' '<<level<<' '<<type<<' '<<step<<endl;return step;}
int main()
{int level;cin>>level;long long int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;long long s1=calc(x1,y1,level,0);//cout<<endl;long long s2=calc(x2,y2,level,0);cout<<s2-s1;return 0;
}

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

  1. 2020/第十一届蓝桥杯国赛/Java-A

    试题A:和数个数 boolean isPrime(int n) {for (int i = 2; i <= Math.sqrt(n); i++) {if (n % i == 0) {return ...

  2. 2020第十一届蓝桥杯国赛JAVA B组真题解析(带源码及解析)

    蓝桥杯历年真题及解析. 目录 蓝桥杯历年真题及解析. A: 美丽的 2 题目: 分析: AC代码: B: 扩散 题目: 分析: AC代码: C: 阶乘约数 题目: 分析: AC代码: D: 本质上升序 ...

  3. 2020第十一届蓝桥杯国赛个人题解+源代码

    先存个样~~之后补全 个人解法,可能不是最佳,欢迎指错 小总结,第一次参加总得来一个国二,(但我还是很菜) 下面是自己习惯性用的头文件 #include<iostream> #includ ...

  4. 2020第十一届蓝桥杯国赛Python组

    A美丽的2 答案:563 res = 0 for i in range(1, 2021):if '2' in str(i):res += 1 print(res) # 563 B合数个数 模拟即可 答 ...

  5. 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑

    题目链接 Ideas 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑 Code Python if __name__ == '__main__':n = int(input( ...

  6. 2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数

    2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数 在线评测 Ideas 对于一个纯循环小数,假设循环节为l,则小数为0.llll-,转换为分数就是 l / (10 ** n ...

  7. 2020十一届蓝桥杯国赛二等奖Java B组

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 参考博客https://blo ...

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

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

  9. 2020第十一届蓝桥杯省赛C组第一场

    2020第十一届蓝桥杯省赛C组第一场 试题 A: 指数计算 问题描述 题解 试题 B: 解密 问题描述 题解 试题 C: 跑步训练 问题描述 题解 试题 D: 合并检测 问题描述 题解 试题 E: R ...

最新文章

  1. intellij出现这种情况can not resolve symbol ‘java‘
  2. 手机技巧:微信这个“设置”建议关闭!否则不到半年就卡爆了
  3. javax.script.ScriptException: ReferenceError: xxx is not defined in eval
  4. 源码安装mysql_CentOS 7中源码安装MySQL 5.7.16 (亲测成功)
  5. 写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格。如输入1990,应输出1 9 9 0。
  6. Elasticsearch-PHP requires cURL, or a custom HTTP handler.
  7. java mysql dump_mysql dump备份和恢复
  8. 大数据hadoop,spark,flink等经典电子书PDF下载
  9. 如何学习财务数据分析,有哪些好工具?
  10. 热带鱼屏保(Marine Aquarium 3),如何才能绕过它的Key Code?
  11. 超高频RFID通道门禁 仓储物流收发货系统应用
  12. NLP-信息抽取-NER-2019:LGN【A Lexicon-Based Graph Neural Network for Chinese NER】
  13. 单片机C51产生正弦波可控制周期(通过计时器)
  14. Flask入门教程——小白的艰难抗争史
  15. IT领域的罗马帝国——微软公司
  16. C语言Qt视图实现彩虹渐变效果,我就问你6不6?
  17. java中length和length()的区别
  18. Android 引导页开发管理2
  19. threejs添加网格辅助线grid
  20. 基于Python模仿流量攻击的方法对字节编码攻击

热门文章

  1. Python3 机器学习之计算香农熵
  2. 大疆MSDK开发指南
  3. CC2530学习(三)定时器定时(轮询)
  4. 74LS164 和 4094 的典型应用
  5. 大数据定律与中心极限定理_为什么中心极限定理对数据科学家很重要?
  6. 面试中 项目遇见的难点答案_盘点产品经理求职面试中“可能”会遇到的十大项目管理问题...
  7. CFile Open函数说明
  8. Java byte数组与十六进制字符串互转
  9. 解决windows下无法启动Tomcat服务,提示“windows不能在本地计算机启动Apache Tomcat.有关更多信息,查阅系统事件日志.如果这是非Microsoft服务,请与服务”的常见方法
  10. XShell 自动输入验证码