浅谈螺旋队列
程序员文章站
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下运行通过。
上一篇: 竖式问题