`
min12605
  • 浏览: 55014 次
  • 性别: 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笔试面试题汇总 基础版 最新 最全

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

    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的...

    逆时针螺旋式旋转输出

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

    C逻旋矩阵源码

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

    propeller:螺旋桨项目

    您可能想要涵盖的内容: Ruby版系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列、缓存服务器、搜索引擎等) 部署说明… 如果您不打算运行rake doc:app请随意使用不同的标记语言。

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

    为保证接收数据的完整性和实时性,提出一种螺旋缓冲区域模型,该模型构造出一个环状队列,可以临时性地存储一定量的数据,这些数据在环形队列中时,就可以随时对数据进行操控。经过球磨机筒体振动信号采集和传输装置...

    app-keeper:骨架在螺旋框架上的应用

    螺旋框架是一个高性能PHP / Go Full-Stack框架,由60多个与PSR兼容的组件组成。 基于混合运行时的Framework执行模型,其中由Application Server 处理的某些服务(GRPC,队列,WebSocket等)和应用PHP代码永久保留在...

    应用程序:Spiral Framework Skeleton HTTP应用程序:队列,控制台,周期ORM

    螺旋HTTP应用程序框架 螺旋框架是一个高性能PHP / Go Full-Stack框架,由60多个PSR兼容组件组成。 基于混合运行时的Framework执行模型,其中由Application Server 处理的某些服务(GRPC,Queue,WebSocket等)和应用...

    0.《程序设计课程设计》指导书(2018版)1

    这将涉及到数据结构(如优先队列)和算法设计。 5. **最小生成树**:这个设计题目涉及到图论,要求学生构建一个算法来连接n个城市,使得边的总权重最小。Prim或Kruskal算法可能会被用到。 6. **学生信息管理系统**...

    几个大公司笔试题的解释

    题目指出,这个队列按照顺时针螺旋的方式向外扩展,每一层的起始数字是连续奇数平方,例如第0层是1,第1层是2到9,第2层是10到25。每层的元素数量可以用公式(2t-1)^2来表示,其中t代表层数。若给定坐标(x, y),可以...

    计算机专业知识.pdf

    * 软件开发模型:瀑布模型、螺旋模型、Incremental 模型等 * 软件测试:黑盒测试、白盒测试、灰盒测试等 * 软件维护:软件更新、软件更换、软件重构等 数据库基础: * 数据模型:关系模型、实体关系模型、对象关系...

    JavaScript版 数据结构与算法

    10-1 螺旋矩阵-原理讲解 10-2 螺旋矩阵-代码实操 10-3 旋转图像-原理讲解 10-4 旋转图像-代码实操第11章 数据结构之“二叉树”二叉树是数据结构中难度最大的没有之一,如何实现一个二叉树结构并对它遍历难于上青天...

    框架:用于现代企业应用程序开发的高性能PHPGo框架

    螺旋式-高性能PHP / Go框架 螺旋框架是一个高性能PHP / Go Full-Stack框架,由60多个PSR兼容组件组成。 基于混合运行时的框架执行模型,其中由应用程序服务器处理的某些服务(GRPC,队列,WebSocket等)和应用程序...

Global site tag (gtag.js) - Google Analytics