蓝桥-皮亚诺曲线距离
求解皮亚诺曲线距离
【问题描述】
皮亚诺曲线是一条平面内的曲线。
下图给出了皮亚诺曲线的 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 感谢观看-
蓝桥-皮亚诺曲线距离相关推荐
- 蓝桥杯第十一届决赛真题之皮亚诺曲线距离
蓝桥杯第十一届决赛真题之皮亚诺曲线距离python 借鉴了https://www.cnblogs.com/EchoZQN/p/14829144.html的做法 然而同样的想法,python代码提交之后 ...
- 2020年第十一届蓝桥杯决赛JAVA B G题“皮亚诺曲线距离“
2020年第十一届蓝桥杯决赛JAVA B G题"皮亚诺曲线距离" 2020国赛 JAVA B组 个人题解目录 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 ...
- 蓝桥杯【第十一届】【决赛】F皮亚诺曲线距离 + G出租车
题目地址 官网地址 F皮亚诺曲线距离 找规律的题目,应该有各种各样的方法来做 (代码写完才发现我的x,y和题目是反过来的qwq, 不过都一样) (顺带吐槽一下,为啥不用写高精度就能过,题目里只是要求答 ...
- 2020第十一届蓝桥杯国赛(决赛)C/C++ B组F题皮亚诺曲线距离题解
F: 皮亚诺曲线距离 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 1 阶情形,它是从左下角出发,经过一个 3 × 3 的方格中的每一个格子,最终到达右上角的一条曲线. 下图给 ...
- 试题 历届真题 皮亚诺曲线距离【第十一届】【决赛】【C组】
试题 历届真题 皮亚诺曲线距离[第十一届][决赛][C组] 提交此题 评测记录 资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Pytho ...
- 蓝桥杯-皮亚诺曲线距离
观察皮亚诺曲线,我们可以得到一下结论. 将整个图形分成九个区域,编号如下: 我们规定一号区域的方向为标准方向,则所有区域的方向为 1:x不翻转,y不翻转 2:x翻转,y不翻转 3:x不翻转,y不翻转 ...
- 第十一届蓝桥杯国赛 C++ B组 试题 F: 皮亚诺曲线距离 (C++代码)
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 1 阶情形,它是从左下角出发,经过一个 3×3 的方格中的每 ...
- 2020年第十一届蓝桥杯国赛—c++B组—试题F:皮亚诺曲线距离
这道题我写了一个多小时,还是自己太菜了,两个样例都过了,三阶皮亚诺随便取了两个点,距离也是正确的,如果有大佬找到了我的问题,欢迎指正 以下是我的思路 思路 总体就是求出两个点到原点的距离,然后相减即可 ...
- 蓝桥杯国赛 皮亚诺曲线距离
参考博客 题意: 题解: 这个很恶魔 本质好说就是找规律,但是贼难写.. 找了篇题解,做法就是大化小,将大阶化为成小阶,计算出离远点的距离...我感觉我是写不出来.. 挺秒的,要推公式估计要一阵子 代 ...
最新文章
- 几个表示“光”的概念
- macbook可以装linux,怎样给老旧的 MacBook 安装 Linux
- 深度学习笔记 第五门课 序列模型 第二周 自然语言处理与词嵌入
- 前端--3、JavaScript
- java简易日历程序报告_简单的日历小程序(java编写)
- springmvc限流解决方案
- html动态计算高度,透明半透明背景
- apt-get update出现404 Not Found
- HTML5——锚点链接
- 面试题:React中setState
- html5 双水波加载动画,逼真的HTML5 3D水波动画 可多视角浏览
- 联想服务器安装2019系统,联想支持的Win10 2019年10月更新(1909版本)的机型
- 360浏览器访问跨域问题
- ISO 3166-1 国家编码
- 【广东大学生网络攻防大赛-WriteUp(非官方)】Misc | 复合
- win10 java8 环境变量_win10下安装JDK8和环境变量配置
- linux每日命令(3):ln命令
- 从苹果创业神话看资本运营应集中优势兵力
- 百度大脑手写文字识别使用攻略
- openwrt-17.01.6 LEDE下载