【POJ3889】Fractal Streets(分形图)
problem
- 给你一个原始的分形图
- t组数据,对于每组数据,输入3个数n,h,o (n为在第n级,h,o为两个房子的编号)
- 求在第n级情况下,编号为h和o的两个点之间的距离*10为多少
其中,第n级分形图形成规则如下:
1. 首先先在右下角和右上角复制一遍n-1情况下的分形图
2. 然后将n-1情况下的分形图逆时针旋转90度,放到左上角
3. 最后将n-1情况下的分形图顺时针旋转90度,放到左下角
编号是从左上角那个点开始计1,沿着道路计数。
solution
递归边界
当n等于1时(即是最初的那个第1级分形图)1.当s等于1,x=1,y=12.当s等于2,x=1,y=23.当s等于3,x=2,y=24.当s等于4,x=2,y=1
递归过程
1.当前编号小于上一级编号总数时该情况说明当前编号是在n级分形图的左上角,但是左上角分形图是n-1级分形图逆时针旋转90度得到的顾我们带入递归式时,需要将x和y,倒一下不明白的同学可以这样看:第1级道路:(1,1)->(1,2)->(2,2)->(2,1)第2级道路左上角:(1,1)->(2,1)->(2,2)->(1,2)两种情况的x和y情况互换了递归式: rec(n-1,s,y,x);2.当编号小于2倍的n-1数目时,说明当前编号s在分形图的右上角由于右边的分形图没有经过旋转所以我们直接带入递归式,需要注意的是我们的编号要减去上一级的编号,因为我们始终是根据上一级来推出下一级递归式:rec(n-1,s-p[n-1],x,y);递归出来之后,我们的x需要加上上一级的边的大小这从分形图中很容易看出即x=x+(1<<n-1);
3.当编号小于3倍的n-1数目时,跟第2种情况类似,只是递归出来之后,x和y都需要加上上一级的边的大小即rec(n-1,s-2*p[n-1],x,y);//注意编号必须要小于上一级的大小// 因为我们是放在上一级的情况下考虑的x+=(1<<n-1);y+=(1<<n-1);
4.最后一种情况,s在第n级分形图的左下角这种情况跟第2种情况差不多,我们先按照逆时针的情况来解决,这就跟第2种情况一样了然后比较坐标x和y的关系,容易看出,顺时针相比于逆时针x映射为(1<<n)+1-xy映射为(1<<(n-1))+1-y可以观察分形图,这个地方有点难理解可以比较坐标来理解
codes
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
void calc(int n, LL id, LL &x, LL &y){if(n == 1){if(id==1)x=1,y=1;if(id==2)x=1,y=2;if(id==3)x=2,y=2;if(id==4)x=2,y=1;}else{LL _id = (1<<(n-1))*(1<<(n-1));if(id <= _id){calc(n-1,id,y,x);}else if(id <= 2*_id){calc(n-1,id-_id,x,y);y += 1<<(n-1);}else if(id <= 3*_id){calc(n-1,id-2*_id,x,y);x += 1<<(n-1);y += 1<<(n-1);}else{calc(n-1, id-3*_id, y,x);x = (1<<n)+1-x;y = (1<<n-1)+1-y;}}
}int main(){int _w; scanf("%lld", &_w);while(_w--){int n; LL h,o;scanf("%d%lld%lld", &n, &h, &o);LL sx, sy, ex, ey;calc(n,h,sx,sy);calc(n,o,ex,ey);printf("%.0f\n",sqrt((sx-ex)*(sx-ex)+(sy-ey)*(sy-ey))*10);}return 0;
}
【POJ3889】Fractal Streets(分形图)相关推荐
- [poj3889]Fractal Streets
转载请说明出处:http://blog.csdn.net/ben_xsy/article/details/79288058#%E4%BB%A3%E7%A0%81 目录 题目描述 解题思路 代码 题目描 ...
- Fractal Streets||分形之城
这道题-蛮难的- 今天看到一句话,特别适合做这道题 文章目录 问题描述 思考 AC代码: 问题描述 城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大 ...
- Fractal Streets (POJ3889)(分形图、递归)
题目传送门:http://poj.org/problem?id=3889 感谢大雪菜大神bilibili上的讲解和李煜东大神书本的引导. 题面大概意思是: 给你一个原始的分形图,t组数据,对于每组数据 ...
- Fractal Streets(经典分形递归+坐标旋转)
原题链接:Fractal Streets 题面: 思路: 本题关键要解决:求编号为MMM的房屋在NNN级城市中的位置.把该问题记为 calc(N,M)calc(N, M)calc(N,M) ,本题就是 ...
- POJ 3889 Fractal Streets(逼近模拟)
$ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法 ...
- 轻松一下:python(turtle模块)绘制分形图
分形 分形,具有以非整数维形式充填空间的形态特征.通常被定义为"一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状",即具有自相似的性质.分形 ...
- Fractal Streets
FractalStreetsFractal StreetsFractal Streets 题目链接:POJ 3889 题目大意 给你一个原始的分形图,ttt组数据,对于每组数据,输入333个数nnn, ...
- 计算机图形学在装饰设计中的应用,混沌分形图在软装饰艺术设计中的应用研究...
摘要: 分形(Fractal)是在二十世纪70年代兴起的最重要的非线性科学之一,曼德尔布罗特(Mandelbrot)通过数学公式迭代和计算机编程技术构建了以自己名字命名的Mandelbrot集,分形理 ...
- 利用python画分形图_使用 Python 绘制 Mandelbrot 分形图
以前收集的关于Mandelbrot分形图的Python脚本,Mandelbrot集合的图像因它洛可可式繁复卷曲华丽的风格而受到大众的欣赏和赞叹,与其他分形图案一起,是许多艺术家和设计师的灵感来源. 是 ...
最新文章
- 科研指导:深度学习的应用研究课程
- GMM-HMM语音识别算法
- MATLAB处理txt文本文件---数据格式要有规律性,否则要用编写特定方式进行读取
- 牛客竞赛语法入门班函数与递归习题【未完结】
- Eclipse内存分析工具的用法
- 速卖通物流发货怎么操作?“解读”重点国家市场物流状况
- Windows下安装OpenSSL及其使用
- SAIF MBA2011年学费与资助政策发布公告
- 度小满面试题20190923
- UNIX 高级环境编程 第10章 信号
- 【Redis 开发与运维】初识 Redis
- 复爱合缘风波后高管调整:命庄海为总裁 王靖为CFO
- wpf之pdf的显示
- 斐波那契常见规律(总结)
- 详细了解如何在npm上发布自己的包?
- [附源码]java毕业设计社区生鲜电商平台
- strcpy、strcpy_s、strncpy、strncpy_s 字符串拷贝用法
- rk3288 RTC实现定时开关机
- L2-020 功夫传人 (25分)(双解法 完整思路+极短代码)
- contos7 安装Redis