希尔伯特曲线

希尔伯特曲线是以下一系列分形曲线 Hn 的极限。我们可以把 Hn 看作一条覆盖 2^n × 2^n 方格矩阵的曲线,曲线上一共有 2^n × 2^n 个顶点(包括左下角起点和右下角终点),恰好覆盖每个方格一次。

[p1.png]

Hn(n > 1)可以通过如下方法构造:
1. 将 Hn-1 顺时针旋转90度放在左下角
2. 将 Hn-1 逆时针旋转90度放在右下角
3. 将2个 Hn-1 分别放在左上角和右上角
4. 用3条单位线段把4部分连接起来

对于 Hn 上每一个顶点 p ,我们定义 p 的坐标是它覆盖的小方格在矩阵中的坐标(左下角是(1, 1),右上角是(2^n, 2^n),从左到右是X轴正方向,从下到上是Y轴正方向),
定义 p 的序号是它在曲线上从起点开始数第几个顶点(从1开始计数)。

以下程序对于给定的n(n <= 30)和p点坐标(x, y),输出p点的序号。请仔细阅读分析源码,填写划线部分缺失的内容。

#include <stdio.h>

long long f(int n, int x, int y) {
    if (n == 0) return 1;
    int m = 1 << (n - 1);
    if (x <= m && y <= m) {
        return f(n - 1, y, x);
    }
    if (x > m && y <= m) {
        return 3LL * m * m + f(n - 1,  , m * 2 - x + 1); //  填空
    }
    if (x <= m && y > m) {
        return 1LL * m * m + f(n - 1, x, y - m);
    }
    if (x > m && y > m) {
        return 2LL * m * m + f(n - 1, x - m, y - m);
    }
}

int main() {
    int n, x, y;
    scanf("%d %d %d", &n, &x, &y);
    printf("%lld", f(n, x, y));

    return 0;
}

注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。

根据曲线的走向,加入点位于右下角的部分,右下角显然是从上面下来(曲线走向),和正确方向的图案相比,其实y坐标对应着图案中的x坐标,只不过相反,小图案边长为m,就是m - y + 1.

原文地址:https://www.cnblogs.com/8023spz/p/10699432.html

时间: 2024-11-10 14:41:25

希尔伯特曲线的相关文章

C++模拟Turtle画希尔伯特曲线

由于缺少支持库,本代码不可实际运行! 仅供思路研究. 1 void up() 2 { 3 turtle.forward(1); 4 } 5 void left() 6 { 7 turtle.left(90); 8 turtle.forward(1); 9 turtle.right(90); 10 } 11 void right() 12 { 13 turtle.right(90); 14 turtle.forward(1); 15 turtle.left(90); 16 } 17 void do

绘制希尔伯特曲线

转自:http://www.easyx.cn/samples/View.aspx?id=57 #include "stdafx.h" #include <graphics.h>#include <conio.h>#include <string>using namespace std; int g_len; // Hilbert 曲线的单位长度//string a;//string a = "123"; // 递归绘制 Hilbe

THREE.js代码备份——canvas - lines - colors(希尔伯特曲线3D、用HSL设置线颜色)

<!DOCTYPE html> <html lang="en"> <head> <title>three.js canvas - lines - colors</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, m

分形之希尔伯特-皮亚诺(Hilbert-Peano)曲线

1890年,意大利数学家皮亚诺(Peano G)发明能填满一个正方形的曲线,叫做皮亚诺曲线.后来,由希尔伯特作出了这条曲线,又名希尔伯特曲线.Hilbert-Peano曲线是一种分形图形,它可以画得无限复杂.它的初始图元是正方形,在迭代生成的过程中,不断细化出小的正方形,图中的线段其实是用于连接各正方形的连线.它的特点是蜿蜒曲折.一气呵成,能经过平面上某一正方形区域内所有的点.希尔伯特曲线是一种奇妙的曲线,只要恰当选择函数,画出一条连续的参数曲线,当参数t在0,1区间取值时,曲线将遍历单位正方形

LA UVaLive 7375 Hilbert Sort (递归,四分图,模拟)

题意:告诉你一条希尔伯特曲线的大小,然后给你n 个人,及n 个人的坐标,你的起点是左下角,终点是右下角,按照希尔伯特的曲线去走,按照这个顺序给n个人排序, 按顺序输出每个人的名字! 析:这就是一个四分图,每次都把当前的图分成四份,左下角的是顺时针旋转,左上角和右上角不变,右下角逆时针旋转90,那么我们就递归这个过程,给所给的人编号, 最后再按编号输出即可. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #in

LBS应用的兴趣点与名称搜索

目前LBS应用已在智能手机中占据了主导地位,但LBS技术覆盖范围太广,很少有能深入描述LBS技术的资料.所以作者在<程序员>杂志开辟专栏来描述LBS核心技术,本文为该专栏的第五篇.目前LBS应用已在智能手机中占据了主导地位,但LBS技术覆盖范围太广,很少有能深入描述LBS技术的资料.所以作者在<程序员>杂志开辟专栏来描述LBS核心技术,本文为该专栏的第五篇. 我们知道,美团与大众点评的涉及30亿美金的重量级合并是非常的吸引眼球的.在这一场合并中,美团主要看重的是大众点评的门店POI

图像处理的一些方法

Atam教授:核希尔伯特空间( 再生Hilbert空间),蒙塔卡罗方法,KNN,多维线性回归,PSF方法回归,特征之间的非线性关系,deep learning,香农信息熵,回归贝叶斯,稀疏字典构造Jayaram: 模糊连通性原理,稀疏分解,非负矩阵分解,svd分解图分割,adaboost,自适应稀疏模型图像基因相关性,协同低秩回归,CCA 从这些里面找几个详细介绍一下,最好有例子 ==========================================================

3D打印技术之切片引擎(1)

切片引擎,是3D打印技术的灵魂,其实质就是将3D模型进行分层,输出矢量集合,是应该归为图形学的一门技术,其对数学算法要求很高,复杂性主要体现在要对3D模型的不同的拓扑结构做出判断并输出与之相符合的矢量集合.就我个人的观点,目前世界上最优秀的切片引擎在这一点上也没有做的很好,所以对于这一门技术,可进步的空间是很大的,未知的空间非常辽阔. 非常有幸的是在我的上一家公司里面,我有机会开发这样的一个模块,我负责由3D模型生成矢量集合,另一位同事把我生成的矢量集合再生成为Gcode,据我所知,目前国内还没

高效的多维空间点索引算法 — Geohash 和 Google S2

原文地址:https://www.jianshu.com/p/7332dcb978b2 引子 每天我们晚上加班回家,可能都会用到滴滴或者共享单车.打开 app 会看到如下的界面: app 界面上会显示出自己附近一个范围内可用的出租车或者共享单车.假设地图上会显示以自己为圆心,5公里为半径,这个范围内的车.如何实现呢?最直观的想法就是去数据库里面查表,计算并查询车距离用户小于等于5公里的,筛选出来,把数据返回给客户端. 这种做法比较笨,一般也不会这么做.为什么呢?因为这种做法需要对整个表里面的每一