POJ3889-Fractal Streets【分形,递归,分治】
生活随笔
收集整理的這篇文章主要介紹了
POJ3889-Fractal Streets【分形,递归,分治】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:http://poj.org/problem?id=3889
大意
第一級城市為圖一,然后每次擴展一級就將原本的城市復制3份,一份放上面,一份正旋90’放左上,一份逆序90’放左邊,最后將4份的頭和尾連起來,規定左上角為編號1,之后根據道路編號。
求在一個n級城市中s號和d號的直線距離。
解題思路
我們可以從n級逐一降級下去,然后每次旋轉的話我們可以旋轉得出的坐標。
code
#include<cstdio> #include<algorithm> #include<cmath> #define ps(x) x*x using namespace std; int pows[31],n,s,d,t,x,y,x1,yy1,x2,y2; void getid(int n,int num)//求坐標 {if(n==1){switch(num){case 2:{y+=1;break;}case 3:{x+=1;y+=1;break;}case 4:{x+=1;break;}}return;}//最后一級特殊判斷int w=(num-1)/pows[n-1]/pows[n-1];//判斷是在哪個區塊switch(w){case 0:{getid(n-1,num-(pows[n-1]*pows[n-1])*w);swap(x,y);//旋轉坐標break;}case 1:{getid(n-1,num-(pows[n-1]*pows[n-1])*w);y+=pows[n-1];//旋轉坐標break;}case 2:{getid(n-1,num-(pows[n-1]*pows[n-1])*w);x+=pows[n-1];y+=pows[n-1];//旋轉坐標break;}case 3:{getid(n-1,num-(pows[n-1]*pows[n-1])*w);int dx=x,dy=y;x=pows[n]+1-dy;y=pows[n-1]+1-dx;//旋轉坐標break;}} } double dis(double x1,double yy1,double x2,double y2) {return sqrt(ps(fabs(x1-x2))+ps(fabs(yy1-y2))); } int main() {scanf("%d",&t);pows[0]=1;for(int i=1;i<=30;i++)pows[i]=pows[i-1]*2;x=1;y=1;for(int ti=1;ti<=t;ti++){scanf("%d%d%d",&n,&s,&d);getid(n,s);x1=x*10;yy1=y*10;x=1;y=1;getid(n,d);x2=x*10;y2=y*10;x=1;y=1;printf("%0.lf\n",dis(x1,yy1,x2,y2));//求直線距離} }總結
以上是生活随笔為你收集整理的POJ3889-Fractal Streets【分形,递归,分治】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三种主要嵌入式数据库
- 下一篇: 广电wifi怎么修改密码如何更换路由器密