浅谈螺旋队列

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

   经过观察,我们可以看到右上角紫色部分是有规律的: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下运行通过。

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/80295623