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

来源:互联网 发布:云计算 视界云 知乎 编辑:程序博客网 时间:2024/05/22 02:06

题意:给出一个希尔伯特曲线(能够穿过一个边长为2n 的正方形中的每单一块),和一个坐标,求这个坐标的方格位于这条曲线上的第几块。

解决思想:递归
每个n阶的希尔伯特曲线是右四个的n-1阶的希尔伯特曲线构成的,分成四个部分。
1.左下角这一部分坐标可以通过对y=x对称得到下一个递归坐标;
2.左上角这一部分坐标可以直接通过对y坐标减去(1<<(n-1));
3.右上角这一部分坐标可以通过对x,y坐标分别减去(1<<(n-1));
4.右下角这一部分坐标可以先对x坐标减去(1<<(n-1))再关于y=-x+(1<<(n-1))对称得到下一个递归坐标;
每次操作完以后要记得要将res加上改坐标前面的部分的总数。

#include<bits/stdc++.h>#define ll long longusing namespace std;ll res=0;int recursion(ll n,ll x,ll y){    if(n == 1)    {        if(x == 1 && y == 1) return 1;        if(x == 1 && y == 2) return 2;        if(x == 2 && y == 2) return 3;        if(x == 2 && y == 1) return 4;    }    ll style;    if(x>(1<<(n-1)) && y>(1<<(n-1))){        style = 2;        y-=(1<<(n-1));        x-=(1<<(n-1));    }    else if(x<=(1<<(n-1)) && y>(1<<(n-1))){        style = 1;        y-=(1<<(n-1));    }    else if(x<=(1<<(n-1)) && y<=(1<<(n-1))){        style = 0;        swap(x,y);    }    else if(x>(1<<(n-1)) && y<=(1<<(n-1))){        style = 3;        x-=(1<<(n-1));        x=((1<<(n-1))+1-x);        y=((1<<(n-1))+1-y);        swap(x,y);    }    res+=style*(1<<(n-1))*(1<<(n-1));    recursion(n-1,x,y);}int main(){    ll n,x,y;    cin>>n>>x>>y;    printf("%lld\n",res+recursion(n,x,y));    return 0;}
原创粉丝点击