下面是一个螺旋队列:
问题: 看清以上数字排列的规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正。例如:7的坐标为(-1,-1),2的坐标为(0,1),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字;或输入任意数字,输出该数字的坐标。
解析:
我们从图片中可以观察到,这个螺旋队列是顺时针螺旋向外扩展的。我们可以把它看成一层一层向外延伸,第0层为中间的那个1,第1层为2到9,第2层为10到25,第三层为26到49。我们可以看出,每一层都有一个最大值max。例如我们就看,第0层到第3层的最大值依次为,1,9,25,49.所以我们可以总结规律,设层数为c,则max=(2*c+1)^2;而c = (|x|,|y|);
我们的下一步工作就是分别找上下左右四条边上的值与max的对应关系:
上边:Utop = max+(x+y);
左边: Uleft= max+(3*x-y);
下边:Ubottom = max + (-x - 5*y);
右边:Uright = max+(-7*x+y);
代码实现:
#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 c = max(abs(x), abs(y));// 该坐标所在第几层
int max = square(2 * c + 1); //该层的最大值
if (y == -c) //上
return max +( x + y);
else if (x == -c) //左
return max + (3 * x - y);
else if (y == c) //下
return max +(- x - 5 * y);
else //右
return max +(- 7 * x + y);
}
void Spiral_QueueTest()
{
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层打印,换行
}
}