一道《程序员面试宝典》上的算法题,对于坐标的操作要有点心得吧。找准基准点,这样能有效的利用规律和坐标轴来运算。
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;
}
分享到:
相关推荐
### 关于螺旋队列算法的精讲 螺旋队列算法是一种特定的数据结构处理方式,在算法设计和实现领域具有一定的研究价值。特别是在软件开发过程中,它能够帮助开发者更好地理解和操作复杂的数据结构,提升程序效率。 ##...
螺旋队列是一个很有意思的数字排列: 如: 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 ...
看清以下数字排列的规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正。例如,7的坐标为(-1,-1),2的坐标为(0,1),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字。
螺旋阵列,输入坐标,显示阵列对应数 螺旋矩阵
- **Message-Driven Bean**:用于接收消息队列中的消息。 #### 10. Collection与Collections的区别 - **面试题背景**:`Collection`与`Collections`虽然只有一字之差,但含义却完全不同。 - **核心知识点**: - ...
显示螺旋队列,//螺旋队列.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的...
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的...
2. **请求管理**:对于每个输入端口而言,需要维护一个队列来记录待处理的请求,并根据Round-Robin机制更新队列中的请求顺序。 3. **冲突检测与处理**:在每个调度周期中,检查是否有多个请求指向相同的输出端口。...
螺旋矩阵的实现可以使用嵌套循环结构,也可以采用栈或队列等数据结构来模拟旋转填充的过程。在这个程序中,考虑到是C++实现,可能使用了迭代的方式来处理,这将涉及对数组的直接访问和条件判断来控制填充的方向。 ...
### 第2届Mathorcup数学建模竞赛优秀论文-A题-A题最佳飞行队列 #### 知识点一:飞行队列的宏观数学模型构建 **背景与意义**: 飞行队列的研究对于理解自然界的生物行为(如大雁迁徙)以及人工系统的优化设计(如...
在编程实现时,可以使用循环和条件判断来控制流程,或者利用队列等数据结构辅助处理。 逆时针螺旋输出的问题对于理解和掌握矩阵操作、边界条件处理以及循环控制逻辑有很好的锻炼作用,是计算机科学基础课程中的常见...
【小学生队列队形编排】是小学体育教学中的重要组成部分,主要目的是培养学生的集体协作精神,提升他们的身体协调性和空间感知能力。本PPT教案详细介绍了多种队形变换及其教学方法,适合教师用于指导小学生进行队列...
【队列练习】是幼儿园管理档案中的重要组成部分,旨在培养孩子们的集体意识、秩序感以及身体协调性。以下是对各种队列练习内容、要求及教法的详细解释: 1. **图形行进** - **直线行进和曲线行进**:包括绕物行进...
2. **解题思路**:阐述解决问题的主要思想,可能是迭代或递归,使用栈、队列等数据结构,或者利用二维数组的特性。 3. **Python代码实现**:展示具体的Python代码,可能包括多种解决方案,比如原始的循环实现,以及...
此外,螺旋遍历算法需要精确控制队列和栈的操作,以确保正确地按螺旋顺序访问节点。 总的来说,这个实验旨在加深理解树的数据结构和遍历方法,特别是孩子兄弟链表的实现以及螺旋遍历的逻辑。通过这样的实践,可以...
数据结构的核心知识如栈、队列、线性表、二叉树和图等都应在选题中得到体现,而题目也可以设置为必做或选做以适应不同学生的学习能力。 2. 题目分解:针对选定的题目,教师需要分解题目,制定由浅入深、由易到难的...
螺旋缓冲模型基于环状队列的概念,创建了一个可以临时存储一定数量数据的存储空间。当数据包到达时,它们会被存入这个环形队列中,允许在任何时候对队列中的数据进行处理,从而确保数据的连续性和完整性。该模型的两...
3. **栈或队列**:使用栈或队列数据结构来辅助实现。例如,可以将每一行的第一个元素入栈,当处理完一行后,将最后一个元素出栈,作为下一行的第一个元素。 每个源代码文件可能采用上述方法之一,或者提出新的独特...