hiho一下 第163周 希尔伯特曲线

来源:互联网 发布:知乎 撩妹技巧 编辑:程序博客网 时间:2024/06/05 19:45

题目1 : 希尔伯特曲线

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

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

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 是分形曲线的阶数,(xy)是 p 的坐标。

1 ≤ n ≤ 30

1 ≤ xy ≤ 2n

输出

p 的序号。

样例输入
3 6 1
样例输出
60
package hihocoder;//https://hihocoder.com/contest/hiho163/problem/1import java.util.*;public class xierbotequxian {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc=new Scanner(System.in);int n=sc.nextInt();long x=sc.nextLong();long y=sc.nextLong();sc.close();System.out.println(solve(x,y,n));}private static long solve(long x,long y,int n){if (n<=1){        if (x==1 && y==1){            return 1;        }else if (x==1 && y==2){            return 2;        }else if (x==2 && y==2){            return 3;        }else{            return 4;        }    }    long rows=(long) Math.pow(2, n)/2;    int xth=0;    long oneCount=rows*rows;    if (x<=rows && y<=rows){        xth=1;    }else if (x<=rows && y>rows){        xth=2;    }else if (x>rows && y>rows){        xth=3;    }else {        xth=4;    }    if (xth==1){        return (xth-1)*oneCount+solve(y, x, n-1);    }else if (xth==2){        long x0=0;        long y0=rows;        return (xth-1)*oneCount+solve(x, y-y0, n-1);    }else if (xth==3){        long x0=rows;        long y0=rows;        return (xth-1)*oneCount+solve(x-x0, y-y0, n-1);    }else{        long x0=2*rows+1;        long y0=rows+1;        return (xth-1)*oneCount+solve(y0-y,x0-x, n-1);    }}}
原创粉丝点击