【演算法競賽進階指南】POJ3889分形之城
阿新 • • 發佈:2018-12-03
本道題目是利用遞迴,去把最後等級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; }