【题目描述】
【题目链接】
http://noi.openjudge.cn/ch0204/8463/
【算法】
为求等级N下的点的坐标可由几何关系找到其与等级N-1下对应点的关系,然后递归直至所有点的祖先(等级0)即可计算出坐标。
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int t; 5 ll n,s,d; 6 pair<ll,ll> calc(int state,ll num) 7 { 8 if(!state) return make_pair(0,0); 9 ll side=1<<(state-1),sum=side*side; 10 ll rec=num/sum,pre_num=num%sum; 11 pair<ll,ll> pr=calc(state-1,pre_num); 12 switch(rec) { 13 case 0: swap(pr.first,pr.second); break; 14 case 1: pr.first+=side; break; 15 case 2: pr.first+=side,pr.second+=side; break; 16 case 3: swap(pr.first,pr.second),pr.first=side-pr.first-1,pr.second=side*2-pr.second-1; 17 } 18 return pr; 19 } 20 int main() 21 { 22 scanf("%d",&t); 23 while(t--) { 24 scanf("%d%lld%lld",&n,&s,&d); 25 pair<ll,ll> p1=calc(n,s-1); 26 pair<ll,ll> p2=calc(n,d-1); 27 ll dx=p1.first-p2.first,dy=p1.second-p2.second; 28 printf("%.0f\n",sqrt(dx*dx*1.0+dy*dy*1.0)*10); 29 } 30 return 0; 31 }