(题面来自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. c++ 让你的应用支持相对路径

    std::string GetCurrentExeDir(){ char szPath[1024] = { 0 };#ifdef WIN32 GetModuleFileName(NULL, szPat ...

  2. 基于PHP实现短信验证码接口的方法

    步骤: 1.登录荣联运通讯注册获取ACCOUNT SID.AUTH TOKEN.Rest URL(生产).AppID(默认): 2.注册测试用手机号码(先注册测试号码方可使用): 3.下载demo示例 ...

  3. Nginx 配置请求响应时间

    1.常见默认nginx.conf配置日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request&quo ...

  4. Flink的DataSource三部曲之一:直接API

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. 基于gin的golang web开发:访问mysql数据库

    web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有 ...

  6. 833. Find And Replace in String —— weekly contest 84

    Find And Replace in String To some string S, we will perform some replacement operations that replac ...

  7. docker容器与宿主机的数据交互

    在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 方式一.Docker cp命令 docker cp :用于容器与主机之间 ...

  8. 6.1 接口 - 6.3 lambda表达式

    6.1 接口 接口概念 接口是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义.设计目的是解决多继承的问题 接口中所有方法时 public 不用现实声明 java.lang.Comparab ...

  9. Sublime Text 3 安装插件与快捷键总结

    ublime Text 3 是一个了不起的软件.首先,它是一个干净,实用,可以快速的编写代码编辑器.它不仅具有令人难以置信的内置功能(多行编辑和VIM模式),而且还支持插件,代码片段和其他许多东西.很 ...

  10. Table is marked as crashed and should be repaired 解决办法

    遇到这个问题几个敲命令轻松搞定 1.首先进入mysql命令台: mysql -u root -p 回车  输入密码 2.查询所有的库 mysql> show databases; 3.进入数据库 ...