螺旋队列

26 篇文章 0 订阅

螺旋队列

 

螺旋队列:如下图所示的螺旋队列,以01所在点为坐标原点建立坐标轴,X方向向右为正,Y方向向下为正。如01坐标为(0,0)02坐标为(1,0)03坐标为(1,1)。试找出规律,给出任意坐标(x,y),返回该坐标处的数字,如给出(0,0)返回1,给出(1,1)返回3

43 44 45 46 47 48 49

42 21 22 23 24 25 26

41 20 07 08 09 10 27

40 19 06 01 02 11 28

39 18 05 04 03 12 29

38 17 16 15 14 13 30

37 36 35 34 33 32 31

1

         解析:如图1可见,第1个方框记为第1层,内有1=1*2-1^2个数,

螺旋队列              螺旋队列       

2                           3

如图2可见,第2个方框记为第2层,内有9=2*2-1^2个数

如图3可见,第3个方框记为第3层,内有25=3*2-1^2个数,

                        第n层,内有(2n-1)^2个数

......

易知对于坐标(x,y)max(|x|,|y|)+1即为该点所在的层次,记为v,再记u=v-1。每一层的一条边上有2*u个数,每一层最小值为(u*2-1^2+1,坐标为(u,-u+1),顺时针增加,最大值为(v*2-1)^2,坐标为(u,-u)

如果x=u,即处于右面竖着的方框旁:

                  如果y=-u,则(x,y)值为(v*2-1^2

                  否则,基准点为(u,-u+1),值为(u*2-1^2+1,即min+1,(x,y)值为min+1+y+u-1);

如果x=-u,即处于左面竖着的方框旁:

                  则基准点为(-u,u),值为(u*2-1^2+2*v,即min+2*v,x,y)值为min+2*v+abs(y-u)

如果y=-u,即处于上面横着的方框旁:

                  则基准点为(-u,-u),值为(u*2-1^2+3*v,即min+3*v,x,y)值为min+3*v+abs(x+u)

如果y=u,即处于下面横着的方框旁:

                  则基准点为(u,u),值为(u*2-1^2+v,即min+v,x,y)值为min+v+abs(x-u)

 

         则可以写出如下程序,完成功能:

int Spin(int x, int y)

{

         int u= max(abs(x),abs(y));

         int v=u+1;

         int count =2*u;

         int min = (u*2-1)*(u*2-1);

         int max = (v*2-1)*(v*2-1);

 

         int result=0;

 

         if ( x == u )

         {

                   if ( y== -u )

                            result = max;

                   else

                            result = min+1+abs(y-(-u+1));

         }

         else if ( x == -u )

                   result = min+2*count+abs(y-u);

         else if ( y== -u )

                   result = min+3*count+abs(x+u);

         else if ( y== u )

                   result = min+count+abs(x-u);

         else

                   result = -1;

 

         return result;

}

         这样的例子有很多,可能坐标原点变化,或者x,y的方向变化,或者增长方向变化,但是思路就是找准基准点,根据坐标进行变换。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值