算法-螺旋队列

问题

21  22  …
20  7   8   9   10
19  6   1   2   11
18  5   4   3   12
17  16  15  14  13

看清以上数字排列的规律,设 1 点的坐标是 (0,0),x 方向向右为正,y 方向向下为正。例如,7 的坐标为 (-1,-1),2 的坐标为 (0,1),3 的坐标为 (1,1)。编程实现输入任意一点坐标 (x,y),输出所对应的数字。

分析

以(0,0) 即 数字 1 为中心,螺旋的形式如图

圆心为第0圈,往外为第1圈,再往外为第2圈,依次类推

每一圈数字的右上角的点p, 它的数值是可以推导出来的

n = 0  -> p =  1   即 (2 * 0 + 1) ^ 2

n = 1  -> p = 9    即 (2 * 1 + 1) ^ 2

n = 2  -> p = 25  即 (2 * 2 + 1) ^ 2

所以,第n圈,右上角的数值为 p = (2n+1)^2,故而,

p1 = p – n

p2 = p – 3n

p3 = p – 5n

p4 = p – 7n

知道了以上点的数值之后,就可以计算任意一点(x,y)处的数值了。

代码

Github

作者:JarvisChu
原文链接:算法-螺旋队列
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

发表评论