题目传送门:http://poj.org/problem?id=3889
感谢大雪菜大神bilibili上的讲解和李煜东大神书本的引导。
题面大概意思是:
   给你一个原始的分形图,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,沿着道路计数。
    分析:
    这是著名的通过一定规律无限包含自身的分形图。为了计算方便,我们将题目中房屋编号从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)(分形图、递归)相关推荐

  1. 【POJ3889】Fractal Streets(分形图)

    problem 给你一个原始的分形图 t组数据,对于每组数据,输入3个数n,h,o (n为在第n级,h,o为两个房子的编号) 求在第n级情况下,编号为h和o的两个点之间的距离*10为多少 其中,第n级 ...

  2. Fractal Streets(经典分形递归+坐标旋转)

    原题链接:Fractal Streets 题面: 思路: 本题关键要解决:求编号为MMM的房屋在NNN级城市中的位置.把该问题记为 calc(N,M)calc(N, M)calc(N,M) ,本题就是 ...

  3. [poj3889]Fractal Streets

    转载请说明出处:http://blog.csdn.net/ben_xsy/article/details/79288058#%E4%BB%A3%E7%A0%81 目录 题目描述 解题思路 代码 题目描 ...

  4. Fractal Streets 递归+坐标转换

    n阶分形图是由前面的(n-1)阶分形图所构成: 左上角是沿Y轴右旋转90度再沿X轴选择180度: 右上角不变: 左下角是沿Y轴左旋转90度再沿X轴选择180度: 右下角不变. 再找到对应的坐标变换: ...

  5. 轻松一下:python(turtle模块)绘制分形图

    分形 分形,具有以非整数维形式充填空间的形态特征.通常被定义为"一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状",即具有自相似的性质.分形 ...

  6. Fractal Streets

    FractalStreetsFractal StreetsFractal Streets 题目链接:POJ 3889 题目大意 给你一个原始的分形图,ttt组数据,对于每组数据,输入333个数nnn, ...

  7. POJ 3889 Fractal Streets(逼近模拟)

    $ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法 ...

  8. 如何用 canvas 画出分形图

    前言 分形是一门以非规则几何形态为研究对象的几何学,由曼德勃 罗(B.B.Mandelbrot)等人创立并命名. 分形图从整体上看,是处处不规律的.但从局部观察,图形的规则性又是相同的,即具有自相似的 ...

  9. 分形图的递归算法简介

    分形图的递归算法 - 在计算机程序设计中,递归是指一个过程直接或间接得调用其自身的一种算法. - 直接递归调用的例子如下: void Recur(n){````Recur(m);```` } 过程Re ...

最新文章

  1. 【干货】产品经理处理工作中突发事件的新技能Get!
  2. antd upload手动上传_Flask上传文件
  3. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇
  4. 淘宝特价版注册“1元更香”商标,又一个新“节日”诞生了
  5. rgbdslam_v2编译过程中引起的needed by错误
  6. Elasticsearch 实现自定义排序插件(转载)
  7. SDUT1500Message Flood(字典树)
  8. 爬虫日记(7):用urllib和beautifulsoup来实战抓取新闻
  9. 迷你上标和下标复制大全(含0~9、字母、特殊字符)
  10. EXP-00091: Exporting questionable statistics.问题解决!(转)
  11. 为何电脑上不显示手机连接服务器,为什么我电脑都能连接上vpn手机却连不上
  12. 从零开始做单相逆变电源(软件)
  13. VUE+ElementUI+SheetJS解析Excel
  14. 人脸识别4-百度商用方案调研
  15. Video.js中m3u8视频清晰度切换
  16. ARDUINO传感器专题介绍(2)
  17. 万能的尾盘选股技巧!今日学明天买,后天稳健盈利!短线炒股一定要收藏!
  18. Quick--组件与基本元素
  19. 《Head First 设计模式》读书笔记——迭代器模式
  20. 多个vue项目合并成一个_多个Excel表格合并成一个表,最简单的方法在这里

热门文章

  1. matlab分形曼德勃罗,曼德勃罗集合分形图案
  2. 不用U盘安装win10系统
  3. Zookeeper学习思维导图
  4. 西门子博图HMI与倍福进行PLC使用OPC DA服务器进行通讯配置
  5. [附源码]java毕业设计旅游网站
  6. 深度:阿里云分布式关系型数据库DRDS解析
  7. Python — 词汇表(一)
  8. 【爬虫修炼和实战】二、从requests开始——爬取喜马拉雅全站音频数据(基础篇)
  9. 三维扫描、三维建模在数字展厅中的应用
  10. vue组件库大全(忘了的时候可以进来找一下~)