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. 计算几何题中的英语生词
  2. atomikos mysql,记一次 Atomikos 分布式事务的使用
  3. 3.6 BatchNorm 为什么起作用-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  4. 三年之久的 etcd3 数据不一致 bug 分析
  5. 游戏开发:OpenGL入门学习
  6. mysql开发中遇到的坑_mysql优化过程中遇见的坑(mysql优化问题特别注意)
  7. python实现手机号归属地相关信息查询
  8. 基于Hibernate+spring的公司网站打造中(二)
  9. 计算机视觉论文-2021-06-29
  10. 动态库动态调用WEbservice的问题!
  11. 中文版orgin图像数字化工具_GetData Graph Digitizer(图表数字化工具) V2.25 官方版
  12. Pascal基础教程
  13. 大话设计模式——解释器模式
  14. cub数据集多少张图片_细粒度分类数据集汇总
  15. Type number trivially inferred from a number literal, remove type annotation.
  16. 云从科技的Pixel-Anchor论文解读
  17. ubuntu安装时姓名、计算机名、用户名的含义
  18. <Linux> Ubuntu kernel 源码编译 替换
  19. 使用U盘代替光盘来刻录ISO镜像文件的方法
  20. [转载]使用兼容ie6 ie7 ie8 FF的text-overflow:ellips

热门文章

  1. 《人类简史》笔记一——快乐该如何计算
  2. 安装IIS不能运行ASP 不能打开ASP文件
  3. 如何在博客主页添加音乐按钮(HTML小试)
  4. 用SQL进行集合运算
  5. C++(4)寄存器变量
  6. 机器学习基础-11:机器学习的分类
  7. windows下的cd命令
  8. 安装IAPWS-IF97-OF
  9. 嵌入式计算机系统设计第四次实验报告
  10. 关于shtml页面include问题解决方案