zoukankan      html  css  js  c++  java
  • 螺旋队列算法分析 (转载)

    (转)http://blog.csdn.net/yhmhappy2006/article/details/2934435

    螺旋队列的样子如下图:

    两大规律:

    1。螺旋规律(红线)

    2。奇数平方规律(紫线)

    问题描述:

    设1的坐标是(0,0),的方向向右为正,y方向向下为正,例如,7的坐标为(-1,-1),

    2的坐标为(0,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字!

    问题解决:

    从紫线突破。从图中不难发现,右上角vc=(2*t+1)(2*t+1),t为该圈x,y坐标的绝对值的最大值。例如vc=9、25、49、81........,算出vc后,就分4个判断区域,分别判断,点落在该圈4条边的哪条边上,从而计算出具体坐标点的值。

    四个区域划分如下图:

    4个区域内4条边上的值u与vc的对应关系为:

    y=-t区:u = vc+(x+y);

    x=-t区:u = vc+(3*x-y);

    y=t区:u = vc + (-x - 5*y);

    x=t区:u = vc+(-7*x+y);

    那么这些关系是怎么得出来的呢?再看图中画上圈的数字:

    在y=-t区,y坐标不变,x坐标变化步长为1。令x=0,此时,u=vc+y作为该边的基准值,其他值随x的变化而变化,得在该区域u=vc+(x+y);

    同理,在x=-t区,x坐标不变,y坐标变化步长为1。令y=0,此时,u=vc+3*x作为该边的基准值,其他值随y的变化而变化,得在该区域u=vc+(3*x-y);

    同理得其他俩区域的表达式。不再赘述。

    程序实现:

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. #define abs(a)    ((a)>0?(a):(-a))
    5. #define max(a,b) ((a)>(b)?(a):(b))
    6. int spiralval(int x,int y)
    7. {
    8. int t = max(abs(x),abs(y));
    9. int vc = (t*2+1)*(t*2+1);
    10. int u;
    11. if ( y == -t) //分别判断,点落在该圈4条边的哪条边上
    12.      u = vc+(x+y);
    13. else if (x == -t)
    14.     u = vc+(3*x-y);
    15. else if (y == t)
    16.      u = vc + (-x - 5*y);
    17. else
    18.      u = vc+(-7*x+y);
    19. return u;
    20. }
    21. int main()
    22. {
    23. int x,y;
    24. cout << endl;
    25. for(y=-5;y<=5;y++)
    26.     {
    27.       for(x=-5;x<=5;x++)
    28.     printf("%5d",spiralval(x,y));
    29.       
    30.       printf("/n");
    31.     }
    32. cin.get();
    33. return 0;
    34. }
  • 相关阅读:
    为什么很多IT公司不喜欢进过培训机构的人呢?
    为何90%的IT技术人员不适合做老大
    一位失足程序员的来信
    你做了哪些事,导致老板下调了对你的评价?
    我的信,你一定要看。
    python 之路,200行Python代码写了个打飞机游戏!
    今天又给即将毕业的学生灌了鸡汤。。。
    收了几个有背景的学生。
    刚收到一个吃瓜群众看了肯定不信的offer!
    关于认识、格局、多维度发展的感触
  • 原文地址:https://www.cnblogs.com/leealvin/p/2352846.html
Copyright © 2011-2022 走看看