(题面来自ACwing)

城市的规划在城市建设中是个大问题。

不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现。

而这座名为 Fractal 的城市设想了这样的一个规划方案,如下图所示:

当城区规模扩大之后,Fractal 的解决方案是把和原来城区结构一样的区域按照图中的方式建设在城市周围,提升城市的等级。

对于任意等级的城市,我们把正方形街区从左上角开始按照道路标号。

虽然这个方案很烂,Fractal 规划部门的人员还是想知道,如果城市发展到了等级 N,编号为 A 和 B 的两个街区的直线距离是多少。

街区的距离指的是街区的中心点之间的距离,每个街区都是边长为 10 米的正方形。

输入格式

第一行输入正整数n,表示测试数据的数目。

以下n行,输入n组测试数据,每组一行。

每组数据包括三个整数 N,A,B, 表示城市等级以及两个街区的编号,整数之间用空格隔开。

输出格式

一共输出n行数据,每行对应一组测试数据的输出结果,结果四舍五入到整数。

数据范围

1≤N≤31,
1≤A,B≤22N,
1≤n≤1000

  分形指的是一种无限包含更小尺度下的自身的几何结构。当然,题中的城市是有最小尺寸边界的,即n = 0时。

  该题的难点是在这样的图中根据房屋编号找到它的坐标位置。我们发现,城市扩建只是扭转了左上、左下第n-1级城市的方向,城市本身的结构没有变化,而每个房屋旋转后的坐标是有规律的。因此,我们想要确定房屋a在第n级城市中的位置,只需要先确定出它在哪个次级的n-1级城市里,求出它在这个子城市中的坐标,然后分情况讨论这个子城市中的房屋在构成现在城市时发生的坐标变化即可。边界:n = 0时,坐标为(0, 0)。总时间复杂度为O(n * N)。确定子城市可以用编号除以子城市大小size(2的(2n-2)次方),确定a在子城市中的编号则可以用编号对size取模得到。为了这一步运算方便,我们把房屋改为从0到n-1编号。具体的坐标变化规律见代码。

  在计算距离的时候遇到了锅,所以想强调一下数据范围。int的最大值是2^31 - 1,刚好够记录城市直径(从0行开始),但是平方级别的编号会炸。所以在记录城市尺寸、房屋编号的时候要记得开long long。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <climits>
  6. #define fst first
  7. #define sec second
  8. #define mp make_pair
  9. typedef long long LL;
  10. using namespace std;
  11. int n, T;
  12. LL a, b;
  13. pair<LL, LL> solve(int n, LL pos) {
  14. if (n == 0) return mp(0, 0);
  15. LL len = 1LL << (n - 1), size = 1LL << ((n << 1) - 2), id = pos / size;
  16. pair<LL, LL> sub = solve(n - 1, pos % size);
  17. LL x = sub.first, y = sub.second;
  18. switch (id) {
  19. case 0:
  20. return mp(y, x);
  21. case 1:
  22. return mp(x, y + len);
  23. case 2:
  24. return mp(x + len, y + len);
  25. case 3:
  26. return mp((len << 1) - y - 1, len - x - 1);
  27. default: break;
  28. }
  29. }
  30. double calc(pair<LL, LL> a, pair<LL, LL> b) {//double sqrt(double x)
  31. return sqrt((a.fst - b.fst) * 1.0 * (a.fst - b.fst) + (a.sec - b.sec) * 1.0 * (a.sec - b.sec)) * 10;
  32. }
  33. int main() {
  34. scanf("%d", &T);
  35. while (T--) {
  36. scanf("%d %lld %lld", &n, &a, &b);
  37. printf("%.0lf\n", calc(solve(n, --a), solve(n, --b)));
  38. }
  39. return 0;
  40. }

【ACwing 98】分形之城——分形的更多相关文章

  1. Acwing 98-分形之城

    98. 分形之城   城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现. 而这座名为 Fractal 的城市设想了这样 ...

  2. Java分形

    目前笔者接触过的分形主要有一下几种: 1.类似Clifford的分形.这种分形的特点是:分形的初始坐标为(0,0),通过初始坐标经过大量的迭代,得到一系列的点,根据得到的点来绘制分形曲线.这类分形的参 ...

  3. 分形在遥感和GIS中的应用

    GIS等高线化简 遥感图像的追踪 分形matlab实现:分形应用于遥感图像处理             低分辨率和高分辨率图形它们的形状是相似的(图像增强) 贪吃蛇和蚁群算法:试想管中窥豹,一只小蚂蚁 ...

  4. 分形之闵可夫斯基(Minkowski)

    与上一篇文章分形之正方形折线相似,闵可夫斯基分形也是分形出正方体,不同之处是它分出了两个正方体. 核心代码: static void FractalMinkowski(const Vector3&am ...

  5. k线图的分形

    蜡烛图上的分形指标,作为一种特殊的K线组合形态,通过对价格的一系列的高低点的描述,辅助识别出市场潜在的突破和反转点,预判后期走势. 顶分形:相邻的五根K线,若中间那根K线最高价为这五根K线的最高价,则 ...

  6. JavaScript图形实例:H分形

    H分形是由一个字母H演化出迷宫一样场景的分形图案,其构造过程是:取一个中心点(x,y),以此中心点绘制一条长为L的水平直线和两条长为H的竖直直线,构成一个字母“H”的形状:再以两条竖直直线的上下共4个 ...

  7. Python 分形算法__代码里开出来的艺术之花

    1. 前言 分形几何是几何数学中的一个分支,也称大自然几何学,由著名数学家本华曼德勃罗( 法语:BenoitB.Mandelbrot)在 1975 年构思和发展出来的一种新的几何学. 分形几何是对大自 ...

  8. 2019.7.12 sdfzoier做题统计

    lixf_lixf :9 P1981 表达式求值 P1076 寻宝 P1199 三国游戏 P1308 统计单词数 P1190 接水问题 P1158 导弹拦截 P1070 道路游戏 P1069 细胞分裂 ...

  9. 分形几何算法和实现(C语言)

    初识分形 1.分形的含义: 英文单词Fractal,它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的.其含义是不规则的.破碎的.分数的.曼德勃罗是想用此词来描述自然界中传统 ...

随机推荐

  1. SpringBoot+JPA+SpringSeurity+JWT

    目的:使用这个框架主要就是为了解决高并发环境下登陆操作对数据库及服务器的压力,同时能保证安全性: 加载时,SpringSecurity定义拦截器和添加两个Fitler: 登陆时,登陆成功,通过传入的信 ...

  2. 关于cookie与本地 存储的区别的问题。

    关于cookie与本地 存储的区别的问题. 1. cookie在浏览器和服务器间来回传递.而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存. 2. coo ...

  3. 02 HTML 常见标记 选择器 样式

    no.02今天主要学习了在web中的HTML CSS,并在其中制作了明信片,在制作明信片途中有几个知识点需要总结:1.HTML 全称hyper text markup language 超文本标记语言 ...

  4. 原生JS结合cookie实现商品评分组件

    开发思路如下: 1.利用JS直接操作DOM的方式开发商品评分组件,主要实现功能有:显示评价评分的样式以及将用户操作后对应的数据返回到主页面 2.主页面引入商品评分组件的js文件并根据规定格式的数据,生 ...

  5. Visual Studio 2017 创建Winfrom工程

    1.打开Visual Studio 2017,出现界面点击-创建新项目 2.选择-Window桌面,选择windows 窗体应用(.NET Framework) 3.完成窗体程序创建,可在左边工具栏里 ...

  6. Scipy 学习第3篇:数字向量的距离计算

    计算两个数字向量u和v之间的距离函数 1,欧氏距离(Euclidean distance) 在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间"普通"(即直线)距离.使用这 ...

  7. find命令的简单使用

    Find命令 格式:find [option] [Path] [筛选条件] [处理动作] Path:默认当前目录 筛选条件:对文件/目录设置筛选条件 处理动作:默认显示所有文件 筛选条件: -name ...

  8. SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)

    SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂) 1.SpringBoot整合Druid Druid是阿里巴巴的一个开源项目,是一个数据库连接池的实现,结合了C3P0. ...

  9. 数据库会话数量过多,定期清理inactive会话

    1.1现象 存在一套11.2.0.4 RAC 2节点,数据库存在5000个会话数量,其中active正在执行的会话500个,其余均为非活跃会话. 大量inactive会话过多给Oracle数据库带来什 ...

  10. 像用excel一样用pandas

    1 说明 预计需要15min阅读此教材: 本教材仅讲述如何查看excel数据,筛选,排序,查找替换数据,不涉及excel中复杂的图形绘制及样式修改. 2 假设 假设,已经存在一个test.xlsx文件 ...