螺旋队列

/* 螺旋队列
  设1的坐标是(0,0),的方向向右为正,y方向向下为正,
例如,7的坐标为(-1,-1),2的坐标为(0,1)。
  编程实现输入任意一点坐标(x,y),输出所对应的数字。

     43 44 45 46 47 48 49
     42 21 22 23 24 25 26
     41 20   7   8   9 10 27
     40 19   6   1   2 11 28  
     39 18   5   4   3 12 29 
     38 17 16 15 14 13 30
     37 36 35 34 33 32 31
 
算法:by smilelance (绝对独家,超级详细,如果你看完这个还不懂,我就无语了~~~)
1、从1开始向外扩散,任意数字所在层应为:t = max(|x|,|y|)。比如5,9在第一层
2、右上角斜线数字为:ur = (2t+1)*(2t+1) 左下角斜线数字为:dl = 2t*2t+1
3、每一圈数字分为四个区域:比如25所在的第二层:
21,22,23,24,25  A区,y == -t     
17,18,19,20,  B区,x == -t  除掉A区数字
13,14,15,16,  C区,y == t   除掉AB区数字
10,11,12    D区,x == t   除掉ABC区数字

4、每一圈数字总数都是8t,右上角数字最大, 减去若干个t就得到四个边的数字,

这就是通过右上角数字取圈内任意数字的关键算法了
*/
#define abs(a)    ((a)>0?(a):(-a))
#define max(a,b)  ((a)>(b)?(a):(b))

void print_helix_number(int n){
    int x, y;
    for(y=-n;y<=n;y++) {
        for(x=-n;x<=n;x++){
            printf("%5d",lookupHelixNumber(x,y)); //n 5以上数字就不对齐拉,嘿嘿
        }
      printf("\n");

    }
}
 
int lookupHelixNumber(int x, int y){
 int t = max(abs(x), abs(y));
 int ur = (2*t+1)*(2*t+1);
 int n = 1;
  if ( y == -t)
    n = ur-t+x;
  else if (x == -t)
    n = ur-3*t-y;    //3t, 5t啥的是规律,观察一圈数字就知道拉
  else if (y == t)
    n = ur-5*t-x;
  else
    n = ur-7*t+y;
   
  return n;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值