98 分形之城(找规律,递归-分治)
1. 问题描述:
城市的规划在城市建设中是个大问题。不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现,而这座名为 Fractal 的城市设想了这样的一个规划方案,如下图所示:
当城区规模扩大之后,Fractal 的解决方案是把和原来城区结构一样的区域按照图中的方式建设在城市周围,提升城市的等级。对于任意等级的城市,我们把正方形街区从左上角开始按照道路标号。虽然这个方案很烂,Fractal 规划部门的人员还是想知道,如果城市发展到了等级 N,编号为 A 和 B 的两个街区的直线距离是多少。街区的距离指的是街区的中心点之间的距离,每个街区都是边长为 10 米的正方形。
输入格式
第一行输入正整数 n,表示测试数据的数目。以下 n 行,输入 n 组测试数据,每组一行。每组数据包括三个整数 N,A,B,表示城市等级以及两个街区的编号,整数之间用空格隔开。
输出格式
一共输出 n 行数据,每行对应一组测试数据的输出结果,结果四舍五入到整数。
数据范围
1 ≤ N ≤ 31,
1 ≤ A,B ≤ 2 ^ (2N),
1 ≤ n ≤ 1000
输入样例:
3
1 1 2
2 16 1
3 4 33
输出样例:
10
30
50
来源:https://www.acwing.com/problem/content/100/
2. 思路分析:
这道题目总体上还是挺难的,首先我们需要找一下图形中的规律,根据N - 1级与N级之间的关系确定相应的关系,如下图所示:
如果我们得到了N - 1级对应的坐标,那么我们就可以根据N - 1级得到的坐标根据相应的规律进行坐标变换得到相应的当前N级的坐标(递归的分治思想),并且在往下递归的时候注意一下相应的偏移量的转换,例如第1级是1~4,第2级是1~16,而我们往下递归的时候可以将当前的A取一个模,为A % block,这样就可以转换为下一级别对应的范围,其中block = 2 ^ 2(N - 1)。
3. 代码如下:
import mathclass Solution:def get(self, n: int, a: int):# 返回[0, 0]if n == 0: return [0, 0]block, _len = 1 << n * 2 - 2, 1 << n - 1p = self.get(n - 1, a % block)x, y = p[0], p[1]# 判断当前属于哪一种情况z = a // blockif z == 0:return [y, x]elif z == 1:return [x, y + _len]elif z == 2:return [x + _len, y + _len]return [_len * 2 - 1 - y, _len - 1 - x]def process(self):T = int(input())for i in range(T):n, a, b = map(int, input().split())pa = self.get(n, a - 1)pb = self.get(n, b - 1)dx, dy = pa[0] - pb[0], pa[1] - pb[1]res = math.sqrt((dx * dx + dy * dy)) * 10# 四舍五入到结果print("{:.0f}".format(res))if __name__ == "__main__":Solution().process()
98 分形之城(找规律,递归-分治)相关推荐
- [剑指offer]面试题第[43]题[Leetcode][第233题][JAVA][1~n整数中1出现的次数][找规律][递归]
[问题描述][困难] [解答思路] 1. 暴力 (超时) 逐个数统计'1'的数量 时间复杂度:O(N^2) 空间复杂度:O(1) public int countDigitOne(int n) {in ...
- UVA - 12627 - Erratic Expansion(找规律递归)
递归找规律即可,用前b行减去前a-1行的红气球个数求解,细节见代码 #include<cstdio> #include<cstring> #include<cstdlib ...
- 98. 分形之城 (分形变换,矩阵旋转)
分形之城 题目 提交记录 讨论 题解 视频讲解 城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现. 而这座名为 Fra ...
- 分形之城:递归超典型例题,还没明白?手把手画给你看!
引用自Acwing,原题链接: 98. 分形之城 文章目录 题目 题解 代码 题目 城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的 ...
- [Leedcode][JAVA][面试题 01.07][找规律][旋转数组]
[问题描述] [面试题 01.07. 旋转矩阵] 示例 1:给定 matrix = [[1,2,3],[4,5,6],[7,8,9] ],原地旋转输入矩阵,使其变为: [[7,4,1],[8,5,2] ...
- 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]
题目链接 解题思路: 1.首先对于每个操作我们实际上是一个博弈问题 对于k=1的操作就是很基础的NIM游戏就是找到一条链的异或和为0 对于k=2的操作通过达打表找规律: 如果s是奇数那么偶数的SG函数 ...
- 递归分治问题之找出两个有序序列的中间值
问题描述: You are interested in analyzing some hard-to-obtain data from two separate databases. Each dat ...
- CodeForces - 603C Lieges of Legendre(博弈+找规律)
题目链接:点击查看 题目大意:首先给出n堆石子和一个k值,两人轮流按照规则操作,不能操作的一方即为失败,每一次都有两种操作: 从任意一堆石子中取走一个石子 任选一堆偶数个的石子,将其转换成k堆x/2的 ...
- Codeforces Round #715 (Div. 1) B. Almost Sorted 找规律
传送门 文章目录 题意: 思路: 题意: 思路: 找规律yydsyydsyyds. 一看没什么想法,所以打了个表,好家伙,不打不知道,一打不得了,下面是n=6n=6n=6的符合要求的情况: 不难发现, ...
最新文章
- enter对应的keycode_键盘对应数字-keycode值大全
- 企业网络推广下的B站二次上市:致力于造就国内最具活力和创造力的内容社区...
- GD项目回顾之JWT
- boost的chrono模块模拟线程接口的测试程序
- Git内部原理之深入解析Git的引用和包文件
- JDK 11的一般可用性
- js 操作vuex数据_vue中使用vuex(超详细)
- 软件测试要求太高,软件“故障门”频现 对软件测试提出更高要求
- CCF 201403-1 相反数
- 超高并发优化技能001--隔离
- Ubuntu下安装Git以及Git帮助手册【转】
- POJ 2503-Babelfish(map)
- pygame重新开始_Pygame(十八)音乐
- PPT中插入矢量图(以及从visio直接复制变模糊的处理方法)
- 以太坊Swarm Bzz节点云解决方案
- 聋校计算机教学案例,聋校汉语拼音b、p的教学案例
- 堆转存目录/tmp或日志目录/var/log可用空间小于 10.0 吉字节。
- java hotspot server_Java HotSpot(TM)64位服务器VM警告
- MavenLombok
- 【机器人学】机器人学领域的顶级期刊和会议