螺旋队列问题

来源:互联网 发布:lua和php 编辑:程序博客网 时间:2024/05/18 13:48

设1点的坐标为(0,0),x方向向右为正,y向下为正,如7的坐标是(-1,-1)。编程实现任意输入一个点的坐标(x,y)。输出所对应的数字。
这里写图片描述

首先对于每一层进行分析:
第0层:只有一个1
第1层:2到9;
第2层:10到25;
。。。

每一层的最后一个数为1,9,25…..是平方数(2t-1)(2t-1)其中t表示层数。n层一共就(2t-1)(2t-1)个数。
每一层分为上下左右四个方向:
右:x=t的方向,(2t-1)(2t-1)+t, 向下是递增的,所以:
(2t-1)(2t-1)+t+y
下:y=t的方向(2t-1)(2t-1)+3t,向左递增和x相反
(2t-1)(2t-1)+3t-x
左:x=-t的方向,(2t-1)(2t-1)+5t, 向上是递增的,和y相反
(2t-1)(2t-1)+5t-y
上:y=t的方向(2t-1)(2t-1)+3t,向左递增和x相同
(2t-1)(2t-1)+7t+x

//螺旋队列问题

#define max(a,b) a>b ? a:bint foo(int x, int y){    int t = max(abs(x), abs(y));    int u = 2 * t - 1;    int w = u*u;    int v;    if (x == -t)        v = w + 5 * t - y;    else if (y == -t)        v = w + 7 * t + x;    else if (y == t)        v = w + 3 * t - x;    else        v = w + t + y;    return v;}
原创粉丝点击