面试题:螺旋队列

下面是一个螺旋队列:
螺旋队列

问题: 看清以上数字排列的规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正。例如:7的坐标为(-1,-1),2的坐标为(0,1),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字;或输入任意数字,输出该数字的坐标。

解析:
我们从图片中可以观察到,这个螺旋队列是顺时针螺旋向外扩展的。我们可以把它看成一层一层向外延伸,第0层为中间的那个1,第1层为2到9,第2层为10到25,第三层为26到49。我们可以看出,每一层都有一个最大值max。例如我们就看,第0层到第3层的最大值依次为,1,9,25,49.所以我们可以总结规律,设层数为c,则max=(2*c+1)^2;而c = (|x|,|y|);
我们的下一步工作就是分别找上下左右四条边上的值与max的对应关系:
上边:Utop = max+(x+y);
左边: Uleft= max+(3*x-y);
下边:Ubottom = max + (-x - 5*y);
右边:Uright = max+(-7*x+y);
螺旋坐标

代码实现:

#include<iostream>
using namespace std;

#define max(a,b) ((a) > (b) ? (a) :(b) )
#define abs(a) ((a) > 0 ? (a) : (-a))
#define square(a) ((a) * (a))

//输入坐标,输出对应的数字

int Spiral_Queue(int x, int y)
{
    int c = max(abs(x), abs(y));// 该坐标所在第几层
    int max = square(2 * c + 1); //该层的最大值

    if (y == -c) //上
        return max +( x + y);
    else if (x == -c) //左
        return max + (3 * x - y);
    else if (y == c) //下
        return max +(- x - 5 * y);
    else  //右
        return max +(- 7 * x + y);

}

void Spiral_QueueTest()
{
    int x, y;
    const int N = 4; //需要打印的层数
    for (y = -N; y <= N; y++)
    {
        for (x = -N; x <= N; x++)
            cout << Spiral_Queue(x, y) << "  ";
        cout << endl;           //按y层打印,换行  
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值