您的位置:首页 > 其它

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

2017-08-16 18:10 555 查看
题意:给出一个希尔伯特曲线(能够穿过一个边长为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 long
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: