螺旋队列-算法设计

 

 

 
【问题描述】

 

  73  74  75  76  77  78  79  80  81
  72  43  44  45  46  47  48  49  50
  71  42  21  22  23  24  25  26  51
  70  41  20   7   8   9  10  27  52
  69  40  19   6   1   2  11  28  53
  68  39  18   5   4   3  12  29  54
  67  38  17  16  15  14  13  30  55
  66  37  36  35  34  33  32  31  56
  65  64  63  62  61  60  59  58  57

    看清以上数字排列的规律,设 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 上实现的,具体代码如下。鉴于代码的具体实现非常简单,这里就不多说了。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值