您的位置:首页 > 其它

螺旋队列

2008-09-24 01:49 162 查看
21 22 23 24 25

20 7 8 9 10

19 6 1 2 11

18 5 4 3 12

17 16 15 14 13

设1的坐标是(0,0),的方向向右为正,y方向向下为正,例如,7的坐标为(-1,-1),

2的坐标为(0,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字!

这是曾经芬兰某通信公司05年面试题(NOKIA?) 2的坐标为(0,1)???。。。先被击晕半天

答案没有注释没有解释 我又晕的不行 看了半天没看懂 百度之 也没人注释 大概太简单了 不需要注释。。。

还好找到思路:先找到右下角最角落的数字,再根据四种情况来判断是在该数字上加几。恩 了解了

似乎用本方块的右上角来容易理解些啊

用了内方块的右上角再加个2倍边长算右下角,我想了这么久 想了这么久。。。

代码:

#include <stdio.h>
#define max(a,b) ((a)<(b)?(b):(a))
#define abs(a) ((a)>0?(a):-(a))
int foo(int x,int y)
{
int t=max(abs(x),abs(y));//求绝对值
int u=t+t;
int v=u-1;//
v=v*v+u;//求右下角点
if(x==-t)//正方形左边的那些点,以下好说了
{
v+=u+t-y;
}
else if(y==-t)
{
v+=3*u+x-t;
}
else if(y==t)
v+=t-x;
else
v+=y-t;
return v;
}
int main()
{
int x,y;
for (y=-4;y<=4;y++)
{
for (x=-4;x<=4;x++)
{
printf("%5d",foo(x,y));
}
printf("/n");

}
while(scanf("%d%d",&x,&y)==2)
printf("%d/n",foo(x,y));
return 0;

}

简单改一下,用右上角的算

int foo(int x,int y)
{
int t=max(abs(x),abs(y));
int u=t+t;
int m=u+1;
int v=m*m;//右上角点
if(y==-t)//逆时针递减就好了
{
v+=-t+x;
}
else if(x==-t)
{
v+=-3*t-y;
}
else if(y==t)
v+=-5*t-x;
else
v+=-7*t+y;
return v;
}
很郁闷的结果就是第一次在CSDN的blog上随便写点东西
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: