螺旋队列(转发)

原创 2007年10月13日 15:04:00

reading 5螺旋队列

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

 

 

 

 

 

 

 

 

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

解:

tips:始终把点看成在正方形的边上,正方形的规模是变化的

给定一个坐标值(x,y)

取得|x|,|y|中的最大值为c,得出所在正方形的边长度为2c+1,正方形右上角顶点值为2c+1的平方(p),它的坐标为(m-m)(m>=0)(作为边上点坐标的参考位置),次级正方形的右上角顶点值为2c-1的平方(q),它的坐标为(j-j)(j>=0),y-n值的绝对值为dx-m值的绝对值为b,判断db的值,

1.       d= =0 && b= =0,对应的 p             /* 右上顶点位置*/

2.       d<=2c && b = =0对应的值为q+d+b;    /*  右上顶点相连的竖线边长,即右边长 */

3.       d= =2c&& b<=2c对应的值为q+d+b;  /* 没有与右上顶点相连的横边,即下边长 */

4.        d<2c && b= =2c,对应的值为p-d-b;      /*  左边长,没有与右上顶点相连的竖边 */

5.        d= =0 && b<2c对应的值为p-d-b;       /*  上边长,与右上顶点相连的横边 */

详细源代码如下: 

#include <iostream>
#include <numeric>
#include <cstdio>
using namespace std;

 

int max(int x, int y);

int foo(int x, int y);

 

int main()

{

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

    cout << "Please input a coordinate: ";
    int r;
    while (cin >> x >> y)
    {
        r = foo (x, y);
        cout << r << endl;
        cout << "Pleas input a coordinate: ";
    }
 
    return 0;
}

int max(int x, int y)
{
    return x > y ? x : y;
}

int foo(int x, int y)
{
    //点(x,y)所在正方形的各项参数
    int iMax = max(abs(x), abs(y));
    int iLength = 2*iMax + 1;
    int iRpValue = iLength * iLength;
    int istep = (iLength-1) / 2;
    int iRpX = istep;
    int iRpY = 0 - istep;

 

    //点(x,y)次级正方形的各项参数
    int isRpValue = (iLength-2) * (iLength-2);

 

    //求出(x,y)与正方形顶点的纵横坐标差值的绝对值
    int iYd = abs(y - iRpY);
    int iXd = abs(x - iRpX);

 

    //根据iYd和iXd的值的分布, 得出点(x,y)相应的数
    int iValue;

 

    if (iYd==0 && iXd==0)
        iValue = iRpValue;
    else if ((iYd<=iLength-1 && iXd==0)
        || (iYd==iLength-1 && iXd<=iLength-1))
        iValue = isRpValue + iYd + iXd;
    else if ((iYd<iLength-1 && iXd==iLength-1)
        || (iYd==0 && iXd<iLength-1))
        iValue = iRpValue - iYd - iXd;
    else iValue = -1;                      /* error handling*/

    return iValue;
}

 

C++语言实现螺旋队列

C++语言实现螺旋队列
  • u013303626
  • u013303626
  • 2016-07-05 21:25:50
  • 476

C++螺旋队列算法分析

螺旋队列的样子如下图: 两大规律: 1、螺旋规律 2、奇数(圈数,或X轴正坐标)平方规律(紫线)   问题描述:   设1的坐标是(0,0),x方向向右为正,y方向向下为正,例如...
  • sinat_24520925
  • sinat_24520925
  • 2015-03-07 17:52:21
  • 713

螺旋队列算法分析

螺旋队列的样子如下图: 两大规律: 1、螺旋规律 2、奇数(圈数,或X轴正坐标)平方规律(紫线)   问题描述:   设1的坐标是(0,0),x方向向右为正,y方向向下为正,例如...
  • yhmhappy2006
  • yhmhappy2006
  • 2008-09-16 00:23:00
  • 16183

c语言写螺旋队列并分析

参考来自(http://www.zxbc.cn/html/20080829/64948.html0); 螺旋队列 21 22 ....  20 7 8 9 10  19 6 1 2 11 ...
  • rhljiayou
  • rhljiayou
  • 2012-03-04 22:02:00
  • 1239

螺旋队列顺时针方向 和逆时针方向的实现

这个博主找规律的部分写得很好,原样放在下面。最后给出了顺时针和逆时针方向的螺旋队列的实现,可以看出它们的差别如此之小。 和螺旋队列类似,也是找规律的zigzag数组见这个帖子。 螺旋队列的样子...
  • u013074465
  • u013074465
  • 2015-01-26 20:05:07
  • 3177

《程序员面试宝典》之螺旋队列问题学习

1.由内向外螺旋队列查找指定位置数值问题。
  • tianzhaixing
  • tianzhaixing
  • 2014-05-19 19:45:15
  • 1171

螺旋队列问题之c语言

下面是一个螺旋队列:    73   74   75   76   77   78   79   80  81    72   43   44   45   46   47   48   ...
  • qq_34068668
  • qq_34068668
  • 2017-07-13 21:55:28
  • 69

打印螺旋队列

#include #include int f(int x,int y) { int n=abs(x)>=abs(y)?abs(x):abs(y);//层数 int sourth_east=...
  • ShangYT
  • ShangYT
  • 2011-11-28 15:50:31
  • 819

螺旋队列的打印

之前写过一篇螺旋矩阵的打印,那次是从外向内旋转,这次改成从内向外旋转,网上搜的资料基本都只有奇数的情况下,我稍微扩充了一下偶数,这种打印矩阵的题就是麻烦,要找规律然后不断的进行调试,废话少说,把我的方...
  • jiang111_111shan
  • jiang111_111shan
  • 2015-06-18 20:17:40
  • 470

螺旋队列算法详解

/* 螺旋队列   设1的坐标是(0,0),的方向向右为正,y方向向下为正,例如,7的坐标为(-1,-1),2的坐标为(0,1)。  编程实现输入任意一点坐标(x,y),输出所对应的数字。     4...
  • smilelance
  • smilelance
  • 2008-12-06 19:35:00
  • 2594
收藏助手
不良信息举报
您举报文章:螺旋队列(转发)
举报原因:
原因补充:

(最多只允许输入30个字)