螺旋队列算法分析

一道题:

21  22 ....
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 的坐标为 (0,1),3 的坐标为 (1,1)。编程实现输入任意一点坐标 (x,y),输出所对应的数字。

---------------------------------------------------------------------------------------------------------------------------------------------------

解:



先看图,不难发现,每圈的最大值是:(2n+1)^2 

4条边上各坐标上的值与max的对应关系为:

上边:topValue = max + ( x + y );

左边: leftValue = max + ( 3x - y );

下边:bottomValue = max + ( -x - 5y );

右边:rightValue = max + ( -7x + y );

-----------------------------------------

图中:topBase = max + y。 

是因为 topBase 的值应该是 max - n,而top上的元素 y=-n,所以topBase = max + y,其他Base的值同理。

--------------------------------------

代码实现:

int foo( int x, int y )

{

        int result = 0 ;

        int n = max( abs(x), abx(y) ) ;

        int maxValue = pow(2*n + 1, 2) ;
        

        //判断在哪条边上

        if ( y == -n ) //top

        {

                result = maxValue + ( x + y ) ;

        }else if ( x == -n ) //left

        {

                result = maxValue + ( 3*x - y ) ;

        }else if ( y == n ) //bottom

        {

                result = maxValue + ( -x - 5*y ) ;

        }else if ( x == n ) //right

        {

                result = maxValue + ( -7*x + y ) ;

        }


        return result ;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值