• 螺旋队列算法分析 (转载)


    (转)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. }
  • 相关阅读:
    js获取元素位置和style的兼容性写法
    javascript正则表达式---正向预查
    Typescript学习笔记(五) 模块机制
    Typescript学习笔记(四)class 类
    Typescript学习笔记(三)变量声明及作用域
    Typescript学习笔记(二)枚举
    Typescript学习笔记(一)基础类型
    tar命令
    linux的nohup命令的用法。
    vue.js移动端app实战1
  • 原文地址:https://www.cnblogs.com/leealvin/p/2352846.html
Copyright © 2020-2023  润新知