参考博客
题意:
题解:
这个很恶魔
本质好说就是找规律,但是贼难写。。
找了篇题解,做法就是大化小,将大阶化为成小阶,计算出离远点的距离。。。我感觉我是写不出来。。
挺秒的,要推公式估计要一阵子
代码:
#include<iostream>
#include<utility>
#include<vector>
#include<cmath>using namespace std;typedef pair < int , int > location;
typedef long long ll;
ll cacl(ll n,location loca){//n级皮亚诺,此时的坐标位置左下角为原点 ll pre_len=pow(3,n-1);ll total=0;location xy(loca.first/pre_len,loca.second/pre_len);ll x=loca.first,y=loca.second;ll num=0;if(xy.first==0){num=xy.second+1;}else if(xy.first==1){if(xy.second==2)num=4;else if(xy.second==1)num=5;else num=6;}else{num=7+xy.second;}total+=pre_len * pre_len * (num-1);if(n==1){return total;//结束标志 }location pre(loca);if(num==1);else if(num==2){pre=make_pair(-(x-pre_len+1),y-pre_len);}else if(num==3){pre=make_pair(x,y-2*pre_len);}else if(num==4){pre=make_pair(x-pre_len,-(y-3*pre_len+1));}else if(num==5){pre=make_pair(-(x-2*pre_len+1),-(y-2*pre_len+1));}else if(num==6){pre=make_pair(x-pre_len,-(y-pre_len+1));}else if(num==7){pre=make_pair(x-2*pre_len,y);}else if(num==8){pre=make_pair(-(x-3*pre_len+1),y-pre_len);}else{pre=make_pair(x-2*pre_len,y-2*pre_len);}return total+cacl(n-1,pre);
}int main(){ll n,x1,y1,x2,y2;cin>>n>>x1>>y1>>x2>>y2;location first(x1,y1),second(x2,y2);//cout<<first.first<<endl;cout<<abs(cacl(n,first)-cacl(n,second));return 0;
}