给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
解法
- 构造一个 n*n 矩阵 matrix,其元素在赋值前均为 0。
- 将走过的元素设为 num。
- 如果到达边界,则改变方向指针。
if (matrix[(i + di) % n][Math.Abs(j + dj) % n] != 0)
当在外圈循环时,因为矩阵索引是基 0 的,所以对于每一个元素,其索引 %n 后得到的还是自己的索引,只有到达边界后(右上、右下、左下),i + di
和j + dj
才会超出索引,%n后的到的是已经走过的元素的索引,该元素必不等于 0 ,此时需要转弯。
当在内圈循环时,不会超出索引,有(i + di)%n = i + di
(j + dj)%n = j + dj
,当此索引对应的元素不为 0 时,说明该路径上的下一元素为上一圈所围成的边界,此时需要转弯。
- 将 i,j 设为下一数字的索引,num++
- 复上述步骤,循环 n2 次,返回 matrix
public int[][] GenerateMatrix(int n)
{
int num = 1;
int i = 0, j = 0;//索引
int di = 0, dj = 1;//方向指针
int[][] matrix = new int[n][];
for (int k = 0; k < n; k++)
{
matrix[k] = new int[n];
}
while (num <= n*n)
{
matrix[i][j] = num;
if (matrix[(i + di) % n][Math.Abs(j + dj) % n] != 0)
{
//判断边界后拐弯
int temp = di;
di = dj;
dj = -temp;
}
i += di;
j += dj;
num++;
}
return matrix;
}