螺旋队列问题
看清以下数字排列的规律,设1点的坐标是(0,0),x方向向右为正,y方向向
下为正。例如,7的坐标为(-1,-1),2的坐标为(0,1),3的坐标为(1,1)。编程实
现输入任意一点坐标(x,y),输出所对应的数字。[芬兰著名软件公司2005年面试题]
解析:规律能看出来,问题就在于如何利用它。很明显这个队列是按顺时针方向螺旋向
外扩展的,我们可以把它看成一层一层往外延伸。第0层规定为中间的那个1,第1层为2到
9,第2层为10到25。1、9、25……不就是平方数吗?而且是连续奇数(1、3、5……)的平
方数。这些数还跟层数相关。推算一下就可以知道,第t层之内共有(2t-1)2个数,因而第t层会
从[(2t-1)2]+1开始继续往外螺旋伸展。给定坐标(x,y),如何知道该点处于第几层?层
数t=max(|x|,|y|)。
知道了层数,接下来就好办多了,这时我们就知道所求的那点一定在第t层这个圈上,
顺着往下数就是了。要注意的就是螺旋队列数值增长方向和坐标轴正方向并不一定相同。可
以分成4种情况——上、下、左、右或者东、南、西、北,分别处于4条边上进行分析。
● 东|右:x==t,队列增长方向和Y轴一致,正东方向(y=0)数值为(2t-1)^2+t,所以v=
(2t-1)^2+t+y。
● 南|下:y==t,队列增长方向和X轴相反,正南方向(x=0)数值为(2t-1)^2+3t,所以
v=(2t-1)^2+3t-x。
● 西|左:x==-t,队列增长方向和Y轴相反,正西方向(y=0)数值为(2t-1)^2+5t,所以
v=(2t-1)^2+5t-y。
● 北|上:y==-t,队列增长方向和X轴一致,正北方向(x=0)数值为(2t-1)^2+7t,所以
v=(2t-1)^2+7t+x。
其实还有一点很重要,不然会有问题。其他3条边都还好,但是在东边(右边)那条线
上,队列增加不完全符合公式。注意到东北角(右上角)是本层的最后一个数,再往下却是
本层的第一个数,当然不满足东线公式。所以我们把东线的判断放在最后(其实只需要放在
北线之后就可以了),这样一来,东北角那点始终会被认为是北线上的点。
答案:代码如下:
-----------------------------------------------------------------------------------------------------------------------------------------------------
如矩阵:
找出规律,并打印出一个N×N的矩阵;规律就是从首坐标开始顺时针依次增大,代码如下: