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