Fractal Streets||分形之城

这道题…蛮难的…
今天看到一句话,特别适合做这道题

问题描述

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

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

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

city.png

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

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

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

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

输入格式
第一行输入正整数 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

思考

第n个城可以看作第n-1个城的四个办法的移动子城;

平面直角坐标系中,向量顺时针旋转公式:
在这里插入图片描述

左上,顺时针旋转90°的旋转后得到 ( − y , x ) ,在沿着 x 轴进行水平翻转得到 ( y , x ) 。
右上,平移
左下,逆时针旋转90°的旋转相当于进行了顺时针 270 ° 的翻转,得到 ( − y , − x ) ,接着进行平移得到 ( 2 ∗ l e n − 1 − y , l e n − 1 − x )
右下,平移;

第n个城有2^2(n-1)个房子;
第n个城中的第n-1的子城每次一部分的移动距离是 2^(n-1);

我的易错点:这里的矩阵和二维数组的模式是一样的不要搞混成学的平面直角坐标系

AC代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

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

PLL calc(ll n,ll m){
  if(n==0) return {0,0};
  ll len=1ll<<(n-1),cet=1ll<<(2*n-2);
  PLL c=calc(n-1,m%cet);
  ll x=c.first,y=c.second;
  ll A=m/cet;
  //cout<<A<<endl;
  if(A==0) return {y,x};
  if(A==1) return {x,y+len};
  if(A==2) return {x+len,y+len};
  return {2*len-y-1,len-x-1};
}

int main(){
    int t;
    cin>>t;
    while(t--){
        ll n,h,o;
        cin>>n>>h>>o;
        PLL ac=calc(n,h-1);
        PLL bc=calc(n,o-1);
        double x=ac.first-bc.first,y=ac.second - bc.second;
        //cout<<x<<" "<<y<<endl;
        printf("%.0lf\n",sqrt(x*x+y*y)*10);
    };
    return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值