(题面来自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. 【转】Setting up SDL 2 on Code::Blocks 12.11

    FROM: http://lazyfoo.net/tutorials/SDL/01_hello_SDL/windows/codeblocks/index.php Setting up SDL 2 on ...

  2. jquery里面的一些方法使用

    prop("属性名");  //获取属性名 prop("属性名","属性值");  //设置属性名 change(fucntion(){  ...

  3. Reading Face, Read Health论文阅读笔记

    摘要: 随着计算技术觉.人工智能和移动技术的发展,利用计算机读脸技术去识别每个人每天的健康是可行的.怎么去设计一个基于FRT(face reading technologies)的用于得到每天的保健实 ...

  4. 03 . Gin+Vue开发一个线上外卖应用(用户数据创建,插入,跨域处理)

    功能和背景介绍 在项目的登录功能中,如果在登录时发现用户名和密码在用户表中不存在,会自动将用户名和密码保存在用户表中,创建一个新的用户. 因此,除了使用手机号和验证码登录以外,还支持使用用户名.密码进 ...

  5. Deployment YAML方式创建Nginx服务

    replication controller Replication Controller为Kubernetes的一个核心内容,应用托管到Kubernetes之后,需要保证应用能够持续的运行,Repl ...

  6. python实现类的多态

    多态 关注公众号"轻松学编程"了解更多. 1.多态使用 一种事物的多种体现形式,举例:动物有很多种 注意: 继承是多态的前提 函数重写就是多态的体现形式 演示:重写Animal类 ...

  7. python框架Django简介与安装

    Django简介 关注公众号"轻松学编程"了解更多. 发布于2005年,最负盛名且成熟的Python网络框架 最初用来制作在线新闻的Web站点 开源Web框架,遵守BSD协议 BS ...

  8. Java导出Pdf格式表单

    前言   作为开发人员,工作中难免会遇到复杂表单的导出,接下来介绍一种通过Java利用模板便捷导出Pdf表单的方式 模拟需求   需求:按照下面格式导出pdf格式的学生成绩单 准备工作 Excel软件 ...

  9. 团灭 LeetCode 股票买卖问题

    很多读者抱怨 LeetCode 的股票系列问题奇技淫巧太多,如果面试真的遇到这类问题,基本不会想到那些巧妙的办法,怎么办?所以本文拒绝奇技淫巧,而是稳扎稳打,只用一种通用方法解决所用问题,以不变应万变 ...

  10. 前端搭建本地服务器(Node)

    通过Node 去官网下载Node并安装.直通车:http://nodejs.cn/ 安装成功 打开cmd(命令提示符),输入'node-v'检查是否安装成功.下图是安装成功,显示的版本可能会不一样(没 ...