螺旋队列
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; } |