现在的位置: 首页 > 综合 > 正文

程序员面试宝典之螺旋队列

2013年12月09日 ⁄ 综合 ⁄ 共 844字 ⁄ 字号 评论关闭

5.5 螺旋队列

21 21..

20 07 08 09 10

19 06 01 02 11

18 05 04 03 12

17 16 15 14 13

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

答案:

思路,给定一个坐标(x,y),首先找出x和y的绝对值的最大值。然后max(x,y)的值赋值给t,

令 u=2*t; 令v=u-1;则可以知道,v代表的是(x,y)坐标所处的螺旋级的下一个级别。

令 v=v*v+u; 这样就可以定位到了(x,y)所在的螺旋级别的某一个十分特殊的位置,偏移量正好等于该层螺旋级的半径。

当 x==t的时候,

则result=v+y-x;

当 y==t的时候

则result=v+y-x;

当 x==-t的时候

result=v+u+t-y;

当y==-t的时候

result=v+u-t-x;

 

代码:

#include <stdio.h>

#define max(a,b) {(a)<(b)?(b): (a)}
#define abs(a) {(a)>0 ? (a): (-a)}

int foo(int x,int y)

{

       intt=max(abs(x),abs(y));

       intu=t+t;

       intv=u-1;

       v=v*v+u;

       if(x==-t)

       {

           v+=u+t-y;

       }

       elseif(y==-t)

       {

              v+=3u-t+x;

       }

       elseif(y==t)

       {

              v+=t-x;

       }

       else

              v+=y-t;

       returnv;
}

int main()

{
       printf(“%d”,foo(1,-2));

}

输出为:24

【上篇】
【下篇】

抱歉!评论已关闭.