欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈螺旋队列

程序员文章站 2022-06-07 14:42:37
...

  螺旋队列的形式如图所示:

浅谈螺旋队列

   经过观察,我们可以看到右上角紫色部分是有规律的:12、32、52、 72······,如果最里面的一圈记为第0层的话那么层数和右上角的数值之间的关系是:(2t+1)2

浅谈螺旋队列

     第t层数值是从(2t-1)2+1开始的。在草稿纸结合如上示意图的帮助,我们可以把每一层的点划分成北、南、西、东四条边,值得注意的是:每一层的右上角的顶点只能划归到北边。其他顶点不做要求。

#include<stdio.h>
#include<math.h>
const int layer = 4;
/*
**输入坐标(x,y),
**求出其在顺时针螺旋队列里对应的值是多少。
*/
int findValue(int x, int y)
{
	/*
	**判断当前坐标所在的层次(从第0层开始)。
	*/
	int layer = abs(x) > abs(y) ? abs(x) : abs(y);//判断该点所在的层次。
	int val = 0;
	int base = (2 * layer - 1)*(2 * layer - 1);
	
	/*
	**螺旋队列增长数值增长方向
	**和坐标轴正方向不一定相同,
	**需要分成北、南、西、东四条线进行分析。
	**右上角是本层的最后一个数,
	**只应该放在上边,而不是右边。
	*/

	if (-layer == y)//北边(东北角是最大值,不符合东线公式)  
	{
		val = base + 7 * layer + x;
	}	
	else if (layer == y)//南边 
	{
		val = base + 3 * layer - x;
	}             	
	else if (-layer == x)//西边  
	{
		val = base + 5 * layer - y;
	}           	
	else if (layer == x) //东边
	{
		val = base + layer + y;
	}             	
	return val;
}

int main() {
	int x, y;
	for (y = -layer; y <= layer; y++)
	{
		for (x = -layer; x <= layer; x++)
		{
			printf("%-5d", findValue(x, y));
		}
		printf("\n");
	}

	printf("请输入两个数:");
	scanf_s("%d,%d", &x, &y);
	printf("下标(%d,%d)对应的值为%d\n", x, y, findValue(x, y));
	return 0;
}
浅谈螺旋队列
本程序在VS2017下运行通过。
相关标签: 螺旋队列