`
xitong
  • 浏览: 6190554 次
文章分类
社区版块
存档分类
最新评论

螺旋队列问题

 
阅读更多

螺旋队列问题


下面是一个螺旋队列:

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
67 38 17 16 15 14 13 30 55
66 37 36 35 34 33 32 31 56
65 64 63 62 61 60 59 58 57



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

解析:规律能看出来,问题就在于如何利用它。很明显这个队列是顺时针螺旋向外扩展的,我们可以把它看成一层一层往外延伸。第 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),如何知道该点处于第几层?层数 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

  其实还有一点很重要,不然会有问题。其它三条边都还好,但是在东边(右边)那条线上,队列增加不完全符合公式!注意到东北角(右上角)是本层的最后一个数,再往下却是本层的第一个数,那当然不满足东线公式啊。所以我们把东线的判断放在最后(其实只需要放在北线之后就可以),这样一来,东北角那点始终会被认为是北线上的点。

下面给出第 t 层的图示说明:



C++代码实现:

//螺旋队列问题

#include <iostream>
using namespace std;

#define max(a,b) ((a)>(b) ? (a) : (b))
#define abs(a) ((a)>0 ? (a) : -(a))
#define square(a) ((a)*(a))

//输入坐标,输出对应的数字
int Spiral_Queue(int x, int y){
	int val;					//该坐标对应的数值
	int t = max(abs(x),abs(y));	//该坐标所在的层数
	if(y == -t)					//北边(北边的判断分支要先于东边,这是为了东北角最大值考虑的)
		val = square(2*t-1)+7*t+x;
	else if(y == t)				//南边
		val = square(2*t-1)+3*t-x;
	else if(x == -t)			//西边
		val = square(2*t-1)+5*t-y;
	else if(x == t)				//东边
		val = square(2*t-1)+t+y;
	return val;
}


int main(){
	int x,y;
	const int N = 4;		//需要打印的层数
	for(y=-N; y<=N; y++){
		for(x=-N; x<=N; x++)
			cout<<Spiral_Queue(x,y)<<"	";
		cout<<endl;			//按y层打印,换行
	}
	return 0;
}




分享到:
评论

相关推荐

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

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

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

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

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

    螺旋阵列_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的...

    propeller:螺旋桨项目

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

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

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

    数据结构及算法C语言实现代码集[推荐下载]

    ./数学问题/桃子猴问题/_notes&#58; ./数学问题/苹果纠纷&#58; ff.c 苹果分法.c ./数据结构&#58; 二叉排序树.c 二叉树实例.c 单链表 双链表正排序.c 各种排序法.c 哈夫曼算法.c 哈慢树.c 大整数.c 建树和遍历.c ...

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

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

    迷宫问题:m×n长方阵表示迷宫

    问题描述: 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 实现要求: ⑴ 实现一个以链表作存储结构的栈...

    JavaScript版 数据结构与算法

    3-1 数组题目介绍 3-2 电话号码组合-原理讲解 3-3 电话号码组合-代码演示 3-4 卡牌分组-原理讲解 3-5 卡牌分组-代码演示 3-6 种花问题-原理讲解 3-7 种花问题-代码演示 3-8 格雷编码-原理讲解 3-9 格雷编码-代码...

    面试准备:面试准备材料。 包括来自Leetcode,CtCI和其他地方的问题

    54.螺旋矩阵 #矩阵#矩阵#矩阵 71.简化路径 #堆 74.搜索二维矩阵 #矩阵#矩阵#二进制搜索#矩阵 138.使用随机指针的复制列表 #链表 189.旋转数组 #aa#数组 199.二叉树右侧视图 #dfs#堆栈#树 284.窥视迭代器...

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

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

    经典数据结构算法c语言实现代码(大全)

    N皇后问题回溯算法.txt ping.txt re.txt source.txt winsock2.txt ww.txt 万年历.txt 万年历的算法 .txt 乘方函数桃子猴.txt 乘法矩阵.txt 二分查找1.txt 二分查找2.txt 二叉排序树.txt 二叉树.txt ...

    史上最全经典数据结构算法c语言实现代码合集

    N皇后问题回溯算法.txt ping.txt re.txt source.txt winsock2.txt ww.txt 万年历.txt 万年历的算法 .txt 乘方函数桃子猴.txt 乘法矩阵.txt 二分查找1.txt 二分查找2.txt 二叉排序树.txt 二叉树.txt ...

    lrucacheleetcode-PrePlacePrep:GeeksforGeeks和LeetCode重要的编码问题

    堆栈和队列 树和 BST 堆 递归 散列 图形 贪婪的 动态规划 分而治之 回溯 位魔法 数组: 给定总和的子数组 数三胞胎 Kadane 算法 数组中缺少数字 合并两个已排序的数组 交替重新排列数组 对数 数组的反转 对 0、1 和 ...

    220个C语言程序源代码集合.zip

    073 队列实例 074 K阶斐波那契序列 第三部分 数值计算与趣味数学篇 075 绘制余弦曲线和直线的迭加 076 计算高次方数的尾数 077 打鱼还是晒网 078 怎样存钱以获取最大利息 079 阿姆斯特朗数 080 亲密数 ...

Global site tag (gtag.js) - Google Analytics