Stupid cat & Doge (分形图)

【题目描述】

    

【题目链接】

    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 }

猜你喜欢

转载自www.cnblogs.com/Willendless/p/9361879.html
cat