螺旋队列

来源:互联网 发布:csol游戏数据异常封号 编辑:程序博客网 时间:2024/04/30 00:14

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上随便写点东西