螺旋队列算法分析

来源:互联网 发布:淘宝网笙24簧乐器 编辑:程序博客网 时间:2024/05/16 18:48

一道题:

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 ;

}

0 0