[hihocoder1324]希尔伯特曲线

这篇博客介绍了一个关于希尔伯特曲线的问题,涉及如何根据给定的坐标计算曲线上点的序号。博主分享了算法思路,指出在处理递归和索引时需要注意的细节,以及解决过程中可能遇到的陷阱。
摘要由CSDN通过智能技术生成

这是hiho一下 第163周的题目。

题目描述

时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
希尔伯特曲线是以下一系列分形曲线 Hn 的极限。我们可以把 Hn 看作一条覆盖 2n × 2n 方格矩阵的曲线,曲线上一共有 2n × 2n 个顶点(包括左下角起点和右下角终点),恰好覆盖每个方格一次。

hilbert-curve.png

Hn(n > 1)可以通过如下方法构造:

  1. 将 Hn-1 顺时针旋转90度放在左下角

  2. 将 Hn-1 逆时针旋转90度放在右下角

  3. 将2个 Hn-1 分别放在左上角和右上角

  4. 用3条单位线段把4部分连接起来

对于 Hn 上每一个顶点 p ,我们定义 p 的坐标是它覆盖的小方格在矩阵中的坐标,定义 p 的序号是它在曲线上从起点开始数第几个顶点。给定 p 的坐标,你能算出 p 的序号吗?

输入
输入包含3个整数 n , x , y 。 n 是分形曲线的阶数,(x, y)是 p 的坐标。

1 ≤ n ≤ 30

1 ≤ x, y ≤ 2n

输出
p 的序号。

样例输入
3 6 1
样例输出
60

算法简介

方法很简单,就是按照题目中描述方法对曲线做切割,判断位置是在左下角或者右上角之类的,然后根据位置切割递归。
容易出错的地方在于这里面的索引值之类的都是从1开始,所以需要 n+

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值