【算法】螺旋队列

 

 

【题目】

7 8 9
6 1 2
5 4 3 

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

【算法分析】

观察队列 如把队列分成一圈一圈,如

7 8 9                                         7  8  9
6 1 2           就能分为     1    和      6      2
5 4 3                                         5  4  3

给圈层排序,发现第n个圈层右上角数字刚好是(2n-1)*(2n-1)。可以从这一点出发求出圈层的各个角点,由此可以确定其他各点的坐标。

【代码】

这是《程序员面试宝典》上的算法:

#include  < stdio.h >
#define  max(a, b)    ((a) < (b) ? (b) : (a))
#define  abs(a)        ((a) > 0 ? (a) : -(a))

int  foo( int  x,  int  y)
{
    
int t = max(abs(x),abs(y));
    
int u = t + t;
    
int v = u - 1;
    v 
= v * v + u;

    
if (x == -t)
    
{
        v 
+= u + t -y;
    }
 
    
else if (y == -t)
    
{
        v 
+= 3 * u +- t;
    }

    
else if (y == t)
    
{
        v 
+= t - x;
    }

    
else
    
{
        v 
+= y - t;
    }

    
return v;
}


int  main()
{
    
int x, y;
    
for (y=-4; y<=4; y++)
    
{
        
for (x=-4; x<=4; x++)
        
{
            printf(
"%5d", foo(x, y));
        }

        printf(
"/n");
    }

    
while (scanf("%d%d"&x, &y) == 2)
    
{
        printf(
"%d ", foo(x, y));
    }

    
return 0;
}

下面是我按照【算法分析】写的foo函数

int  foo( int  x,  int  y)
{
    
if ( (0 == x) && (0 == y))
    
{
        
return 1;
    }


    
int t = max(abs(x), abs(y));
    
int u = (2*+ 1* (2*+ 1);

    
if (y == -t)
    
{
        u 
-= (t - x);
    }

    
else if (x == -t)
    
{
        u 
-= (t + y + 2*t);
    }
else if (y == t)
    
{
        u 
-= (t + x + 4*t);
    }
else
    
{
        u 
-= (t - y + 6*t);
    }

    
return u ;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值