FreedomLy's blog.

【每周一坑】螺旋矩阵

字数统计: 634阅读时长: 2 min
2017/06/23 Share

螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。
matrix

问题

输出如图的螺旋矩阵

1
2
3
4
  1    2    3    4
12 13 14 5
11 16 15 6
10 9 8 7

附加题

输入一个正整数N,输出以N为边长的螺旋矩阵。

思路

需要找到数字在二维数组中赋值的规律:

  1. 设x,y分别二维矩阵行和列的下标,则任意元素都可以用matrix[x][y]来表示,将矩阵matrix中所有元素初始值设置为0;
  2. 为数组中的各个元素赋值,要求matrix[x][y]除了初始化之外没有被赋过新值;
  3. 从第一行,当y < N时,x不变,递增y,同时为matrix[x][y]赋新值,直到y = N(从右至左);
  4. 然后开始递增x(x<N),y不变,为matrix[x][y]赋新值(从上至下);
  5. 接下来开始递减y(y>=0),x不变,为matrix[x][y]赋新值(从右至左);
  6. 最后递减x(x>=0),y保持不变,为matrix[x][y]赋新值(从下至上);
  7. 重复3-6步,直到最后赋的值等于N的平方

Python实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#  -*- coding: utf-8 -*-
# 打印输出螺旋矩阵


def gen_matrix(n):
# 用二维数组来代表矩阵
matrix = [[0 for col in range(n)] for row in range(n)]
return matrix


def get_rota_matrix(n):
mat = gen_matrix(n) # 初始矩阵,所有元素都为0
x = y = 0
total = mat[x][y] = 1 # 将数组第一个元素设为1,即mat[0][0] = 1
while total != n * n:
while y + 1 < n and not mat[x][y + 1]: # 从左至右
y += 1
total += 1
mat[x][y] = total
while x + 1 < n and not mat[x + 1][y]: # 从上之下
x += 1
total += 1
mat[x][y] = total
while y - 1 >= 0 and not mat[x][y - 1]: # 从右至左
y -= 1
total += 1
mat[x][y] = total
while x - 1 >= 0 and not mat[x - 1][y]: # 从下至上
x -= 1
total += 1
mat[x][y] = total
return mat


if __name__ == '__main__':
n = int(input("请输入矩形数组的大小:"))
matrix = get_rota_matrix(n)
# print(matrix)
for i in range(n):
for j in range(n):
print('%4d' % matrix[i][j], end=" ")
print()

测试

输出结果
当N = 4 时:

1
2
3
4
5
6
>>> 请输入矩形数组的大小: 4

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

当N = 5 时:

1
2
3
4
5
6
7
>>> 请输入矩形数组的大小: 5

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

结果与要求一致,可以输出任意N的螺旋矩阵。

End~


CATALOG
  1. 1. 问题
  2. 2. 思路
  3. 3. Python实现
  4. 4. 测试