Fractal Streets (POJ3889)(分形图、递归)
题目传送门:http://poj.org/problem?id=3889
感谢大雪菜大神bilibili上的讲解和李煜东大神书本的引导。
题面大概意思是:
给你一个原始的分形图,t组数据,对于每组数据,输入3个数n,h,o (n为在第n级,h,o为两个房子的编号),求在第n级情况下,编号为h和o的两个点之间的距离*10为多少。
其中,第n级分形图形成规则如下:
- 首先先在右下角和右上角复制一遍n-1情况下的分形图
- 然后将n-1情况下的分形图顺时针旋转90度,放到左上角
- 最后将n-1情况下的分形图逆时针旋转90度 ,放到左下角
编号是从左上角那个点开始计1,沿着道路计数。
分析:
这是著名的通过一定规律无限包含自身的分形图。为了计算方便,我们将题目中房屋编号从0开始编号,那么S与D也都减掉1.
大体思路:设calc(n,m)求编号为m的房屋编号在n级城市中的坐标位置,那么距离是:calc(n,s-1) 与 calc(n,d-1)的距离。
从n(n > 1)级城市由四座n-1级城市组成,其中:
1.左上的n-1级城市由城市结构顺时针旋转90度,从编号的顺序看,该结构还做水平翻转,坐标转换至n级时如下图。
2与3.右上和右下和原始城市结构一样,坐标转换至n级时如下图。
4.左下的n-1级城市由城市结构逆时针旋转90度,从编号的顺序看,该结构也做了水平翻转。
旋转坐标的变化可通过公式:
(设len = 2(n-1))当旋转角度是逆时针90度时,也就是顺时针270度时,(x,y)->(y, -x),然后再进行水平翻转,(y,-x)->(-y,-x)。然后再将图形平移到n级图形的左下角,在格子上的坐标变化是,水平方向增加len - 1个位置,垂直方向增加2len - 1个位置。因此坐标(x,y)按照规则转移到了(2len-1-y,len-1-x).
注意:n-1级格子里拥有的房子数量是cnt = 22n /4,即22n-2.
当前编号m在N级格子的哪个方位是:m / cnt.
当前编号m在n-1级格子里的编号是: m %cnt;
详细代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
pair<LL,LL> calc(LL n, LL m){if(n == 0) return make_pair(0,0);LL len = 1ll << (n-1) , cnt = 1ll << (2*n - 2);pair<LL,LL> pos = calc( n-1, m%cnt);LL x = pos.first , y = pos.second;LL z = m / cnt;//z的值代表这n-1级的(x,y)在n级城市中的方位。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);//右下 return make_pair(2*len-1-y, len - 1- x);// 左下
}
int main(){int T;cin >> T;while(T--){LL N,A,B;cin >> N >> A >> B;pair<LL,LL> s = calc(N, A - 1);pair<LL,LL> d = calc(N, B - 1);LL ax = s.first - d.first,ay = s.second - d.second;cout <<fixed << setprecision(0) << sqrt(ax * ax + ay * ay)*10<< endl;} return 0;
}
Fractal Streets (POJ3889)(分形图、递归)相关推荐
- 【POJ3889】Fractal Streets(分形图)
problem 给你一个原始的分形图 t组数据,对于每组数据,输入3个数n,h,o (n为在第n级,h,o为两个房子的编号) 求在第n级情况下,编号为h和o的两个点之间的距离*10为多少 其中,第n级 ...
- Fractal Streets(经典分形递归+坐标旋转)
原题链接:Fractal Streets 题面: 思路: 本题关键要解决:求编号为MMM的房屋在NNN级城市中的位置.把该问题记为 calc(N,M)calc(N, M)calc(N,M) ,本题就是 ...
- [poj3889]Fractal Streets
转载请说明出处:http://blog.csdn.net/ben_xsy/article/details/79288058#%E4%BB%A3%E7%A0%81 目录 题目描述 解题思路 代码 题目描 ...
- Fractal Streets 递归+坐标转换
n阶分形图是由前面的(n-1)阶分形图所构成: 左上角是沿Y轴右旋转90度再沿X轴选择180度: 右上角不变: 左下角是沿Y轴左旋转90度再沿X轴选择180度: 右下角不变. 再找到对应的坐标变换: ...
- 轻松一下:python(turtle模块)绘制分形图
分形 分形,具有以非整数维形式充填空间的形态特征.通常被定义为"一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状",即具有自相似的性质.分形 ...
- Fractal Streets
FractalStreetsFractal StreetsFractal Streets 题目链接:POJ 3889 题目大意 给你一个原始的分形图,ttt组数据,对于每组数据,输入333个数nnn, ...
- POJ 3889 Fractal Streets(逼近模拟)
$ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法 ...
- 如何用 canvas 画出分形图
前言 分形是一门以非规则几何形态为研究对象的几何学,由曼德勃 罗(B.B.Mandelbrot)等人创立并命名. 分形图从整体上看,是处处不规律的.但从局部观察,图形的规则性又是相同的,即具有自相似的 ...
- 分形图的递归算法简介
分形图的递归算法 - 在计算机程序设计中,递归是指一个过程直接或间接得调用其自身的一种算法. - 直接递归调用的例子如下: void Recur(n){````Recur(m);```` } 过程Re ...
最新文章
- 【干货】产品经理处理工作中突发事件的新技能Get!
- antd upload手动上传_Flask上传文件
- BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇
- 淘宝特价版注册“1元更香”商标,又一个新“节日”诞生了
- rgbdslam_v2编译过程中引起的needed by错误
- Elasticsearch 实现自定义排序插件(转载)
- SDUT1500Message Flood(字典树)
- 爬虫日记(7):用urllib和beautifulsoup来实战抓取新闻
- 迷你上标和下标复制大全(含0~9、字母、特殊字符)
- EXP-00091: Exporting questionable statistics.问题解决!(转)
- 为何电脑上不显示手机连接服务器,为什么我电脑都能连接上vpn手机却连不上
- 从零开始做单相逆变电源(软件)
- VUE+ElementUI+SheetJS解析Excel
- 人脸识别4-百度商用方案调研
- Video.js中m3u8视频清晰度切换
- ARDUINO传感器专题介绍(2)
- 万能的尾盘选股技巧!今日学明天买,后天稳健盈利!短线炒股一定要收藏!
- Quick--组件与基本元素
- 《Head First 设计模式》读书笔记——迭代器模式
- 多个vue项目合并成一个_多个Excel表格合并成一个表,最简单的方法在这里