螺旋队列(转发)

原创 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;
}

 

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

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

螺旋队列算法分析

[置顶] 螺旋队列算法分析 分类: 常用算法收集 面试2008-09-16 00:23 12473人阅读 评论(29) 收藏 举报 算法cn2outputobjectstring ...
  • yangting09032214
  • yangting09032214
  • 2015年08月26日 15:56
  • 538

C++语言实现螺旋队列

C++语言实现螺旋队列
  • u013303626
  • u013303626
  • 2016年07月05日 21:25
  • 418

螺旋队列(内螺旋队列以及外螺旋队列)

外螺旋队列问题:
  • flyapy
  • flyapy
  • 2014年07月02日 00:24
  • 364

简单的Socket消息转发实现

简单的Socket消息转发实现闲来无事,就琢磨了一下socket;本节将实现一个简单的socket消息分发机制.功能比较简单,不喜勿喷.现在成熟的消息分发有XMPP,MQTT等.分发协议参考JMS. ...
  • u012963788
  • u012963788
  • 2015年10月20日 12:11
  • 4144

黑马程序员——用二维数组打印螺旋方阵和螺旋矩阵

------- android培训、java培训、期待与您交流! ---------- ————————————————————————————————————————————————————————...
  • zz1017161726
  • zz1017161726
  • 2015年04月26日 15:42
  • 1530

用java实现螺旋数组

接收数组的行数和列数,返回正序和倒序的螺旋数组(java实现)
  • baokx
  • baokx
  • 2014年09月03日 17:27
  • 1281

螺旋矩阵(c语言实现)

腾讯2016年实习生笔试题 蛇形矩阵,也叫螺旋矩阵,指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大, 向左变大,向上变大,如此循环。 /* 思想就是: 螺旋,有四个方向,从左到...
  • yaqi_2010
  • yaqi_2010
  • 2016年04月03日 22:38
  • 5590

一种打印螺旋式矩阵的方法

用户输入一个维度,打印从中心向外逆时针旋转的矩阵,左上角为最后一个数。例如输入5,输出为:24 23 22 21 20 09 08 07 06 19 10 01 00 05 18 11 02 0...
  • bflong
  • bflong
  • 2015年08月04日 10:58
  • 849

螺旋矩阵(C语言实现)- 2016.01.04

给定一个整数 N , 生成一个 N * N 的矩阵,矩阵中的元素取值为 1 ~ N*N , 1 在左上角,其余各数按顺时针方向旋转前进,依次递增。例如,当 N = 4 时,矩阵的内容如下: 1 2 3...
  • baishileily
  • baishileily
  • 2016年01月05日 00:51
  • 563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:螺旋队列(转发)
举报原因:
原因补充:

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