分形之城

分形之城

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

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

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

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

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

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

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

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

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

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

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

数据范围
1≤N≤311≤N≤31,
1≤A,B≤22N1≤A,B≤22N,
1≤n≤10001≤n≤1000
输入样例:
3
1 1 2
2 16 1
3 4 33
输出样例:
10
30
50

在这里插入图片描述

#include <iostream>
#include <cmath>

using namespace std;

typedef long long LL;
typedef pair<LL, LL> PLL;


PLL calc(LL n, LL m)
{
    if (!n) return {0, 0};//边界条件
    LL len = 1ll << (n - 1), cnt = 1ll << (2 * n - 2);//len表示的是上一级的边长长度也就是当前长度的一半,cnt表示的是1等级城镇的个数
    auto pos = calc(n - 1, m % cnt);//在上一等级的城镇中能够通过旋转移动对应的序号
    auto x = pos.first, y = pos.second;
    auto z = m / cnt;
    if (z == 0) return {y, x};
    if (z == 1) return {x+ len, y };
    if (z == 2) return {x + len, y + len};
    return {len  - 1 - y, len* 2 - x - 1};
}


int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        LL N, A, B;
        cin >> N >> A >> B;
        auto ac = calc(N, A - 1);
        auto bc = calc(N, B - 1);
        double x = ac.first - bc.first, y = ac.second - bc.second;
        printf("%.0lf\n", sqrt(x * x + y * y) * 10);
    }
    return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值