日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ3889-Fractal Streets【分形,递归,分治】

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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【分形,递归,分治】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。