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

给定 k 阶皮亚诺曲线上的两个点的坐标,请问这两个点之间,如果沿着皮亚诺曲线走,距离是多少?
第二行包含两个整数 x1,y1,表示第一个点的坐标。
第三行包含两个整数 x2,y2,表示第二个点的坐标。
其中有 ,0 ≤ k ≤ 100, 0 ≤ x1, y1, x2, y2 < 3^k, x1, y1, x2, y2 ≤ 10^18 。数据保证答案不超过 10^18。
输出
#include"iostream" using namespace std; long long n; long long cheng(long long a,long long n) {
long long ans=1; while(n) {
if(n%2==1){
ans*=a; n--; } a*=a; n/=2; } return ans; } long long dfs(long long n,long long xx,long long yy) {
if(n==0)return 1; if(n>=40)n=39; long long k,x,y,a,b; k=cheng(3,n-1);//(n-1)阶时的边长,也就是n阶时,分成9个(n-1)阶时每一块的边长 x=xx%k;//判断该点在所在块内的横纵坐标 y=yy%k;//判断该点在所在块内的横纵坐标 a=xx/k;//判断所在块的横纵坐标 b=yy/k;//判断所在块的横纵坐标 if(a==0&&b==0) return 0*k*k+dfs(n-1,x,y); else if(a==0&&b==1)return 1*k*k+dfs(n-1,k-1-x,y); else if(a==0&&b==2)return 2*k*k+dfs(n-1,x,y); else if(a==1&&b==2)return 3*k*k+dfs(n-1,x,k-1-y); else if(a==1&&b==1)return 4*k*k+dfs(n-1,k-1-x,k-1-y); else if(a==1&&b==0)return 5*k*k+dfs(n-1,x,k-1-y); else if(a==2&&b==0)return 6*k*k+dfs(n-1,x,y); else if(a==2&&b==1)return 7*k*k+dfs(n-1,k-1-x,y); else if(a==2&&b==2)return 8*k*k+dfs(n-1,x,y); //根据二阶图,找出其中每一个一阶的与一阶图的横纵坐标关系,注意图形一样,开始点和结束点的位置也一样 } int main() {
long long x1,x2,y1,y2; cin>>n; cin>>x1>>y1; cin>>x2>>y2; long long ans=dfs(n,x1,y1)-dfs(n,x2,y2);//找出两点到(0,0)间的距离 if(ans<0)ans=-ans; cout<<ans<<endl; return 0; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208573.html原文链接:https://javaforall.net
