分形之城--没过,吃宵夜去了,生蚝真好吃

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

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

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

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

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

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

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

输入格式

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

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

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

输出格式

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

数据范围

1≤N≤31

1≤A,B≤22N

1≤n≤1000

输入样例:
3 
1 1 2 
2 16 1 
3 4 33 
输出样例:
10 
30 
50 

没过不敢说话

用QQ旋转了几幅图

n=4

n=5

不难看出

右上是左上左旋转90°,再向上翻转180°得到的 (如果只是单纯的图形 旋转90°就可以得到,但是我希望得到一个入出口一样的图形 就需要再翻转一次)

右下同左上

左下是左上向右旋转180°得到的 (为了保证入出口 所以必须是向右旋转)

当n大于等于2之后 城市编号的大小变成

找到规律之后就是模拟了,递归找到n的位置,通过旋转变化

举个例子 n=3的时候 找55

n是奇数的时候

最开始的图形是

int ji[3][3]

{

0,0,0,

0,1,2,

0,4,3,

};

[1,16] [17,32],[33,48],[49,64]

55位于第四个区间

(最开始x=y=1 ,x,y表示55的坐标)

第四个区间位于ji数组 [2][2]的位置

那么

x+=(ji数组一维坐标-1)*权重 (x+= (2-1)*4 = 5)

y+=(ji数组二维坐标-1)*权重 (y+= (1-1)*4 = 1)

找到之后 要把ji数组按规则进行变换 即按 左上变成左下的规则

此时

ji={

0,0,0,

0,3,4,

0,2,1

};

在[49,52],[53,56],[57,60],[61,64]

55处于第2区间,

根据

一维坐标是1 ,二维坐标是2

x+= (1-1)*2 = 5

y+= (2-1) *2 = 3

找到之后 要把ji数组按规则进行变换 即按 左上变成右上的规则

ji={

0,0,0,

0,3,2,

0,4,1

};

在区间[53,53],[54,54],[55,55],[56,56]中 55位于第三区间 ji[1][1]

x+=(1-1)*1=5

y+=(1-1)*1 = 3

则 55的坐标是(5,3)

依次去求坐标,时间复杂度是log(n),也不会超时)

代码下次再发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值