什么是螺旋矩阵

关于螺旋矩阵的说法不一,这里指的是形如

21 22................

20 7 8 9 10

19 6 1 2 11

18 5 4 3 12

17 16 15 14 13

的矩阵。

问题有两个:

1. 编程实现输出这个矩阵

2. 设1点的坐标是(0,0),x方向向右为正,y方向向下为正.例如:7的坐标为(-1,-1) ,2的坐标为(0,1),3的坐标为(1,1).编程实现输入任意一点坐标(x,y),输出所对应的数字。

1. 第一个问题我是采用模拟进行构造的,可以看到从1开始的方向变化始终是 right->down->left->up,

所持续走的长度为1->1->2->2->3->3->...,发现了这个规律不难写出代码了!注意下面我把1的位置设置

在((n-1)/2, (n-1)/2)的位置。

void Simulate(int n)

{

int x, y;

x = y = (n - 1) / 2; //1的位置

data[x][y] = 1;

int len = 1;

int count = 0;

int num = 2;

DIRECTION dir = RIGHT;

while(num <= n * n)

{

for(int i = 0; i < len; i++)

{

switch(dir)

{

case LEFT:

--y; break;

case RIGHT:

++y; break;

case UP:

--x; break;

case DOWN:

++x; break;

default: break;

}

data[x][y] = num++;

}

count++;

if(count == 2)

{

count = 0;

len++;

}

dir = (DIRECTION)((dir + 1) % 4);

}

}

2. 第二个问题我也是先找出规律,然后进行模拟。

首先,不难看出n*n的螺旋矩阵的右下角的坐标一定是(m, m),这里m=n-1

通过观察,可以看出 n=1的时候,右下角(0,0)的值为1,当n=2的时候,右下角(1,1)的坐标值为(3,3),当n=3的时候,右下角(2,2)的坐标值为13.直觉告诉我,这个值是关于n的二次函数,设f(n) = a*n^2 + b*n + c

联立方程组,可以求得a,b,c。 最终算出来的f(n) = 4*n^2 - 2*n + 1

下面再根据(x,y)和右下角(n-1,n-1)之间的关系,计算出值即可。这里要注意当x的值与n-1相同时,应优先考虑y与-m是否有联系。这就要求在函数中要注意x,y的判断先后顺序了。

代码如下:

//以(1,1)所在位置作为原点,向右作为x正半轴,向下作为y正半轴

int GetValue(int x, int y)

{

int m = max(abs(x), abs(y));

int rightBottom = m * m * 4 - 2 * m + 1;

int value = 0;

if(x == -m)

{

value = rightBottom + 2 * m + m - y;

}

else if( y == m)

{

value = rightBottom + m - x;

}

else if(y == -m)

{

value = rightBottom + 4 * m + x + m;

}

else if( x == m )

{

value = rightBottom - (m - y);

}

return value;

}