螺旋队列最优算法的解法

今天下了本《程序员面试宝典》,看到有个螺旋队列的题目,发现解法没有注释,好像还有点复杂,索性自己重写了一个,发现比书上的精炼不少,我估计应该是最优解法了.

21   22   23   24   ...
20     7     8     9   10
19     6     1     2   11
18     5     4     3   12
17   16   15   14   13  
    看清以上数字的排列规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正。例如,7的坐标为(-1,-1),2的坐标为(1,0),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字。

 

 

#include using namespace std; int abs(int x){ if(x>0) return x; else return -x; } int getNum(int x,int y){ int n,s; // n是所在圈数,s为上圈末尾值 int val; // 结果 if (0==x && 0==y) return 1; // 下面六句才是关键,应该好懂吧,呵呵....... n=abs(x)>abs(y)?abs(x):abs(y); //确定圈数 s=(n*2-1)*(n*2-1); //计算上圈最后一个值,为2n-1的平方 if (x==n && y!=-n) val=s+n+y; // 第1列,s+n后为中间值,加减x或y调整 else if (y==n && x!=n) val=s+n-x+n*2; // 第2列,第二列加上2n调整,2n就是第一列的几个数 else if (x==-n && y!=n) val=s+n-y+n*2*2;// 第3列,第三列加上2个2n else if (y==-n && x!=-n) val=s+n+x+n*2*3;// 第4列,同样的,第四列加3个2n return val; } void main(void){ int i,j; for(i=-4;i<=4;++i){ for(j=-4;j<=4;++j){ cout<

你可能感兴趣的:(算法)