分形之城问题

13 篇文章 0 订阅
1 篇文章 0 订阅

目录

题目描述

样例

题目解析

代码


题目链接:98. 分形之城 - AcWing题库

题目描述

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

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

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

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

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

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

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

输入格式

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

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

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

输出格式

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

数据范围

1≤N≤311,
1≤A,B≤2^2N,
1≤n≤1000

样例

输入样例:

3 
1 1 2 
2 16 1 
3 4 33 

输出样例:

10 
30 
50 

题目解析

在等级为n中,我们可以用n-1表达出来,这给了我们用递归的机会。下面我们讨论坐标变换的情况

 现在需要知道现在的坐标在n-1的哪个位置,我们可以将坐标取模,模上n-1的城市数量即可。

代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;

typedef long long LL;

struct Point{
    LL x;
    LL y;
};

Point dfs(LL n,LL a)
{
    if(n==0) return {0,0};
    
    LL len = 1ll << (n-1), sum = 1ll << (2*n - 2);
    
    auto dda = dfs(n-1,a%sum);
    LL dx = dda.x, dy = dda.y;
    int q = a / sum;
    if(q==0) return {dy,dx};
    else if(q==1) return {dx,dy+len};
    else if(q==2) return {dx+len,dy+len};
    else return {len*2-dy-1,len-dx-1};
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        LL n,a,b;
        cin>>n>>a>>b;
        auto db = dfs(n,b-1);
        auto da = dfs(n,a-1);
        
        double dx = da.x-db.x;
        double dy = da.y-db.y;
        
        printf("%.0lf\n",sqrt(dx*dx+dy*dy)*10);
    }
    
    
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值