《希尔伯特曲线》题目分析
题目中已经说明Hn是由4个Hn-1旋转拼接而成,递归的结构非常明显。所以对于求Hn中(x, y)的序号,我们自然而然会想能否转化成在Hn-1中求(x', y')的序号。
实际上我们只需要考虑Hn中的(x, y)是在左下、左上、右上、右下4个Hn-1中的哪一个里,即可转化成在Hn-1中求(x', y')序号的子问题。具体(x, y)到(x', y')的对应关系涉及到坐标平移和旋转,留给大家思考,不再赘述。
以样例为例,如上图所示,H3中的(6, 1)在右下角的H2中,并且对应着H2中(4, 3)这个点。
如果我们能正确求出H2中(4, 3)这个点的序号是12,又因为前3个H2中一共包含16x3=48个点,那么我们就能求出H3中的(6, 1)的序号是12+48=60。
最后需要注意的是n=30时一共包含2^60个点,所以计算序号的时候需要用64位整型存储。
你看题目分析特别在最后提醒要用64bit整型 :D