`
min12605
  • 浏览: 55565 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

螺旋队列

阅读更多
      一道《程序员面试宝典》上的算法题,对于坐标的操作要有点心得吧。找准基准点,这样能有效的利用规律和坐标轴来运算。
http://blog.csdn.net/sweetna/archive/2008/08/29/2846816.aspx 写道
螺旋队列


一道题:

21 22 ....
20  7  8   9   10
19  6  1   2   11
18  5  4   3   12
17 16 15 14 13

      看清以上数字排列的规律,设 1 点的坐标是 (0,0),x 方向向右为正,y 方向向下为正。例如,7 的坐标为 (-1,-1),2 的坐标为 (0,1),3 的坐标为 (1,1)。编程实现输入任意一点坐标 (x,y),输出所对应的数字。[Finland 某著名通信设备公司 2005 年面试题]

      规律是什么?规律真的一看就能看出来,问题就在于如何利用它。很明显这个队列是顺时针螺旋向外扩展的,我们可以把它看成一层一层往外延伸。第 0 层规定为中间的那个 1,第 1 层为 2 到 9,第 2 层为 10 到 25,……好像看出一点名堂来了?注意到 1、9、25、……不就是平方数吗?而且是连续奇数(1、3、5、……)的平方数。这些数还跟层数相关,推算一下就可以知道第 t 层之内一共有 (2t-1)^2 个数,因而第 t 层会从 [(2t-1)^2] + 1 开始继续往外螺旋。给定坐标 (x,y),如何知道该点处于第几层?so easy,层数 t = max(|x|,|y|)。

     知道了层数,接下来就好办多了,这时我们就知道所求的那点一定在第 t 层这个圈上,顺着往下数就是了。要注意的就是螺旋队列数值增长方向和坐标轴正方向并不一定相同。我们可以分成四种情况——上、下、左、右——或者——东、南、西、北,分别处于四条边上来分析。

东|右:x == t,队列增长方向和 y 轴一致,正东方向(y = 0)数值为 (2t-1)^2 + t,
          所以 v = (2t-1)^2 + t + y

南|下:y == t,队列增长方向和 x 轴相反,正南方向(x = 0)数值为 (2t-1)^2 + 3t,
         所以 v = (2t-1)^2 + 3t - x

西|左:x == -t,队列增长方向和 y 轴相反,正西方向(y = 0)数值为 (2t-1)^2 + 5t,
         所以 v = (2t-1)^2 + 5t - y

北|上:y == -t,队列增长方向和 x 轴一致,正北方向(x = 0)数值为 (2t-1)^2 + 7t,
         所以 v = (2t-1)^2 + 7t + x

      其实还有一点很重要,不然会有大 bug。其它三条边都还好,但是在东边(右边)那条线上,队列增加不完全符合公式!注意到东北角(右上角)是本层的最后一个数,再往下却是本层的第一个数,那当然不满足东线公式啊。怎么办?好办。反正其它三条都满足不是吗,我们把东线的判断放在最后(其实只需要放在北线之后就可以),这样一来,东北角那点始终会被认为是北线上的点啦~(四个角上的数,除了东北角|右上角的数字应该由北列的公式计算,其他的三个角都是可以由相交的两列的公式算出的)

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

    if (y == -t) {
           v += 7*t + x;
    }
    else if (x == -t) {
           v += 5*t - y;
    }
    else if (y == t) {
           v += 3*t - x;
    }
    else {
           v += t + y;
    }
    return v;
}
 
分享到:
评论

相关推荐

    【Linux】关于螺旋队列算法的精讲

    ### 关于螺旋队列算法的精讲 螺旋队列算法是一种特定的数据结构处理方式,在算法设计和实现领域具有一定的研究价值。特别是在软件开发过程中,它能够帮助开发者更好地理解和操作复杂的数据结构,提升程序效率。 ##...

    C 语言写的螺旋队列

    螺旋队列是一个很有意思的数字排列: 如: 73 74 75 76 77 78 79 80 81 72 43 44 45 46 47 48 49 50 71 42 21 22 23 24 25 26 51 70 41 20 7 8 9 10 27 52 69 40 19 6 1 2 11 28 53 68 39 18 5 4 3 12 29 54 ...

    使用C++,关于螺旋队列问题

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

    螺旋阵列_C++_算法

    螺旋阵列,输入坐标,显示阵列对应数 螺旋矩阵

    java笔试面试题汇总 基础版 最新 最全

    - **Message-Driven Bean**:用于接收消息队列中的消息。 #### 10. Collection与Collections的区别 - **面试题背景**:`Collection`与`Collections`虽然只有一字之差,但含义却完全不同。 - **核心知识点**: - ...

    luoxuan.rar_4 3 2 1

    显示螺旋队列,//螺旋队列.cpp // 21 22 ... ... // 20 7 8 9 10 // 19 6 1 2 11 // 18 5 4 3 12 // 17 16 15 14 13 //看清以上数字排列的规律,设1点的坐标是(0,0),X方向向右为正,y方向向下为正。例如,7的...

    C++面试题(经典)

    2. 螺旋队列:螺旋队列是一种数据结构,结合了队列的先进先出(FIFO)特性与数组的线性存储方式,通常用于解决特定的算法问题,如二维数组的螺旋遍历。`螺旋队列.cpp`可能涉及如何实现这种数据结构及其应用。 3. 宏...

    程序员面试宝典-第三版(高清带目录)

     8.4 螺旋队列问题  8.5 概率  第9章 STL模板与容器  9.1 向量容器  9.2 泛型编程  9.3 模板  0章 面向对象  10.1 面向对象的基本概念  10.2 类和结构  10.3 成员变量  10.4 构造函数和析构函数  10.5 ...

    栈和队列源代码

    6. **打印二维矩阵的螺旋顺序**:使用两个栈,一个负责行的前进,另一个负责列的移动,可以实现打印二维矩阵的螺旋顺序。 7. **最小生成树的Prim算法**:Prim算法在构造最小生成树时,使用优先队列(如Java的...

    基于螺旋线的Round-Robin Crossbar调度算法

    2. **请求管理**:对于每个输入端口而言,需要维护一个队列来记录待处理的请求,并根据Round-Robin机制更新队列中的请求顺序。 3. **冲突检测与处理**:在每个调度周期中,检查是否有多个请求指向相同的输出端口。...

    luoxuan.rar_螺旋

    螺旋矩阵的实现可以使用嵌套循环结构,也可以采用栈或队列等数据结构来模拟旋转填充的过程。在这个程序中,考虑到是C++实现,可能使用了迭代的方式来处理,这将涉及对数组的直接访问和条件判断来控制填充的方向。 ...

    第2届Mathorcup数学建模竞赛优秀论文-A题-A题最佳飞行队列.doc

    ### 第2届Mathorcup数学建模竞赛优秀论文-A题-A题最佳飞行队列 #### 知识点一:飞行队列的宏观数学模型构建 **背景与意义**: 飞行队列的研究对于理解自然界的生物行为(如大雁迁徙)以及人工系统的优化设计(如...

    逆时针螺旋式旋转输出

    在编程实现时,可以使用循环和条件判断来控制流程,或者利用队列等数据结构辅助处理。 逆时针螺旋输出的问题对于理解和掌握矩阵操作、边界条件处理以及循环控制逻辑有很好的锻炼作用,是计算机科学基础课程中的常见...

    小学生队列队形编排和图解PPT教案.pptx

    【小学生队列队形编排】是小学体育教学中的重要组成部分,主要目的是培养学生的集体协作精神,提升他们的身体协调性和空间感知能力。本PPT教案详细介绍了多种队形变换及其教学方法,适合教师用于指导小学生进行队列...

    2021最新幼儿园管理档案-队列练习内容和要求.doc

    【队列练习】是幼儿园管理档案中的重要组成部分,旨在培养孩子们的集体意识、秩序感以及身体协调性。以下是对各种队列练习内容、要求及教法的详细解释: 1. **图形行进** - **直线行进和曲线行进**:包括绕物行进...

    python-leetcode面试题解之第54题螺旋矩阵-题解.zip

    2. **解题思路**:阐述解决问题的主要思想,可能是迭代或递归,使用栈、队列等数据结构,或者利用二维数组的特性。 3. **Python代码实现**:展示具体的Python代码,可能包括多种解决方案,比如原始的循环实现,以及...

    实验报告-实验111

    此外,螺旋遍历算法需要精确控制队列和栈的操作,以确保正确地按螺旋顺序访问节点。 总的来说,这个实验旨在加深理解树的数据结构和遍历方法,特别是孩子兄弟链表的实现以及螺旋遍历的逻辑。通过这样的实践,可以...

    数据结构课程实践的螺旋式教学.pdf

    数据结构的核心知识如栈、队列、线性表、二叉树和图等都应在选题中得到体现,而题目也可以设置为必做或选做以适应不同学生的学习能力。 2. 题目分解:针对选定的题目,教师需要分解题目,制定由浅入深、由易到难的...

    高速数字振动信号无线接收螺旋缓冲算法

    螺旋缓冲模型基于环状队列的概念,创建了一个可以临时存储一定数量数据的存储空间。当数据包到达时,它们会被存入这个环形队列中,允许在任何时候对队列中的数据进行处理,从而确保数据的连续性和完整性。该模型的两...

    C逻旋矩阵源码

    3. **栈或队列**:使用栈或队列数据结构来辅助实现。例如,可以将每一行的第一个元素入栈,当处理完一行后,将最后一个元素出栈,作为下一行的第一个元素。 每个源代码文件可能采用上述方法之一,或者提出新的独特...

Global site tag (gtag.js) - Google Analytics