螺旋队列的形式如图所示:
经过观察,我们可以看到右上角紫色部分是有规律的: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下运行通过。