73 74 75 76 77 78 79 80 81 |
看清以上数字排列的规律,设 1值所在 的坐标为( 0 , 0 ), x 方向向右为正, y 方向向上为正。例如 7 的坐标为( -1 , 1 ), 2 的坐标为( 0 , 1 ), 17 的坐标为( -2 , -2 )。编程输入任意点坐标( x , y ),输出所对应的数字。
【分析及设计】
该题是芬兰某著名通信设备公司的面试题。
这是一道关于螺旋队列的题目,该队列从 1值所在的坐标点 按顺时针方向螺旋形成队列。分析这种问题,我认为应该先建立坐标,幸好问题中已经为我们做了这部分工作。
以 1 为原点,第一象限中对角线上的值为奇数的平方值;经过认真观察,按原点向外扩散的方向,分别为 1 , 3 , 5 , 7…… 的平方值。那么接下来,我们就以这些平方值点为参照物来具体分析各种情况下坐标点所对应的数值。
( 1 ) 首先计算给定坐标点 x 、 y 值中绝对值最大的一个,记为 a ,然后记( a*2+1 )为 n 。那么 n2 值对所对应的坐标点就是之前我们选定的参照物。
( 2 ) 如果 x 的绝对值最大,就 x 的正负分别分析。如果 x 为正,则坐标点在第一象限,这种情况下,我们应该选定 (n-2)2 作为参照物,因为坐标点( a , a )与( a , a-1 )间数值有一个突变。该坐标点数值可以表示为( n-2 ) 2 + ( a-y );否则,该坐标点数值可以表示为 n2 -2*a-(a-y) 。
( 3 ) 如果 y 的绝对值最大,同样以其正负分别处理。若 y 为正,坐标点数值可以表示为 n2- ( a-x );否则,其数值为 n2 -4*a- ( x- ( -a ))。
( 4 ) 最后处理特殊情况。( 0 , 0 )坐标点对应数值为 1 ,( a , a )坐标点对应数值为 n2 。
【具体实现】
我是用 C 语言在 Ubuntu 上实现的,具体代码如下。鉴于代码的具体实现非常简单,这里就不多说了。