螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。
题目描述
对于一个n行m列的表格,我们可以使用螺旋的方式给表格依次填上正整数。
例如,一个4行5列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
输入描述
输入的第一行包含两个整数n,m ,分别表示螺旋矩阵的行数和列数。其中2≤n,m≤1000。
输出描述
打印输出该矩阵
实现思路
该题原理很简单,根据规律可以看出,矩阵的值是按照右->下->左->上的顺序进行递增,由此可以用列表和循环的方式实现。具体情形看代码注释。
代码实现
n, m = map(int, input().split())
# 创建二维数组
Map = [[0] * m for i in range(n)]
# 构造矩阵
# 初始坐标为(0,0),值为1
x, y = 0, 0
value = 1
Map[x][y] = value
# 判定循环结束条件,当value值等于n*m时循环结束
while value < n * m:
# 先向右走 y变大
# 需满足以下条件 1、不能越界 2、下一个坐标没有数字
while y + 1 < m and Map[x][y + 1] == 0:
y += 1
value += 1
Map[x][y] = value
# 再向下走 x变大
# 需满足以下条件 1、不能越界 2、下一个坐标没有数字
while x + 1 < n and Map[x + 1][y] == 0:
x += 1
value += 1
Map[x][y] = value
# 再向左走 y变小
# 需满足以下条件 1、不能越界 2、下一个坐标没有数字
while y > 0 and Map[x][y - 1] == 0:
y -= 1
value += 1
Map[x][y] = value
# 再向上走 x变小
# 需满足以下条件 1、不能越界 2、下一个坐标没有数字
while x > 0 and Map[x - 1][y] == 0:
x -= 1
value += 1
Map[x][y] = value
# 打印矩阵
for i in range(n):
for j in range(m):
print(Map[i][j], end=' ')
print()
结果
附言
有的题目还要求输入两个整数r,c,打印螺旋矩阵第r行第c列的值。其中1≤r≤n,1≤c≤m。
代码实现:
n, m = map(int, input().split())
r, c = map(int, input().split())
Map = [[0] * m for i in range(n)]
# 模拟行进的过程
# 初始坐标为(0,0),值为1
x, y = 0, 0
value = 1
Map[x][y] = value
while value < n * m:
# 先向右走 y变大
# 需满足以下条件 1、不能越界 2、下一个坐标没有数字
while y + 1 < m and Map[x][y + 1] == 0:
y += 1
value += 1
Map[x][y] = value
# 再向下走 x变大
# 需满足以下条件 1、不能越界 2、下一个坐标没有数字
while x + 1 < n and Map[x + 1][y] == 0:
x += 1
value += 1
Map[x][y] = value
# 再向左走 y变小
# 需满足以下条件 1、不能越界 2、下一个坐标没有数字
while y > 0 and Map[x][y - 1] == 0:
y -= 1
value += 1
Map[x][y] = value
# 再向上走 x变小
# 需满足以下条件 1、不能越界 2、下一个坐标没有数字
while x > 0 and Map[x - 1][y] == 0:
x -= 1
value += 1
Map[x][y] = value
for i in range(n):
for j in range(m):
print(Map[i][j], end=' ')
print()
# 注意,矩阵坐标从0开始,所以打印时要减一。
print(Map[r - 1][c - 1])