1. 程式人生 > >【演算法競賽進階指南】POJ3889分形之城

【演算法競賽進階指南】POJ3889分形之城

本道題目是利用遞迴,去把最後等級1的某個位置求出來,然後回溯向上去把上一等級的相應位置求出來,一般是右下角向左上右上左下擴充套件,根據旋轉的規律回溯計算

城市的規劃在城市建設中是個大問題。不幸的是,很多城市在開始建設的時候並沒有很好的規劃,城市規模擴大之後規劃不合理的問題就開始顯現。而這座名為 Fractal 的城市設想了這樣的一個規劃方案,如下圖所示:

左上順時針90°,右上向上反轉,左下是逆時針90°

#include<iostream>
#include<utility>
#include<cmath>
#include<cstdio>
using namespace std;

pair<long long,long long> calc(long long n,long long m){
    if(n==0) return make_pair(0,0);
    long long len=1<<(n-1),cnt=1<<(2*n-2);//len城市等級-1,cnt為當前等級的城市-1數
    pair<long long,long long> pos=calc(n-1,m%cnt);
    long long x=pos.first,y=pos.second;
    long long z=m/cnt;
    if(z==0) return make_pair(y,x);
    if(z==1) return make_pair(x,y+len);
    if(z==2) return make_pair(x+len,y+len);
    if(z==3) return make_pair(2*len-y-1,len-x-1);
}

int main(){
    int t;
    cin>>t;
    while(t--){
        pair<long long,long long>a,b;
        long long k1,k2,l;
        cin>>l>>k1>>k2;
        a=calc(l,k1-1);//-1代表編號-1,便於處理
        b=calc(l,k2-1);
        double ans=(double)(10*sqrt(1.0*(a.first-b.first)*(a.first-b.first)+1.0*(a.second-b.second)*(a.second-b.second)));
        printf("%.0lf\n",ans);
    }
    return 0;
}