1. Planteando la pregunta
Una matriz en espiral es una forma de matriz común que se caracteriza por disponer los elementos en forma de espiral. Una matriz espiral de orden n significa que el tamaño de la matriz es n × n, donde n es un número entero positivo.
2. Ideas de solución
Cuando N=1, la matriz es ;
Cuando N=2, la matriz es ;
Cuando N>2 (N es un número par como N=4), la matriz es ;
Cuando N>2 (N es un número impar como N=5), la matriz es .
Figura 1 Diagrama de análisis de matriz espiral
3. Resolución de problemas mediante método recursivo
Del análisis de las ideas anteriores y la Figura 1, se puede ver que cuando N>2, se puede dividir en k (k = N//2) cajas espirales cuadriláteras, y la longitud de cada lado es la longitud de la caja ( n)-1 (es decir, n-1). Solo el valor inicial de la esquina superior izquierda y la longitud del borde son diferentes. Si N es un número impar, hay un valor final N² en el centro exacto.
Por lo tanto, se puede calcular mediante recursividad.
El código del programa es el siguiente:
N = 5
def prt(b): # 打印二维列表
for i in range(N):
for j in range(N):
print("%3d" % b[i][j], end='')
print()
def Helix_Matrix(N):
matrix = [] # 初始化二维矩阵matrix(二维列表)
for i in range(N):
matrix.append([])
for j in range(N):
matrix[i].append(0)
matrix[N//2][N//2] = N*N # 若N为奇数时,正中间为N²
cnt = 0
n = N
for k in range(N//2):
for j in range(n-1): # 矩形上边,从左向右
cnt += 1
matrix[k][k+j] = cnt
for i in range(n-1): # 矩形右边,从上往下
cnt += 1
matrix[k+i][k+n-1] = cnt
for j in range(n-1): # 矩形下边,从右向左
cnt += 1
matrix[k+n-1][k+n-1-j] = cnt
for i in range(n-1): # 矩形左边,从下往上
cnt += 1
matrix[k+n-1-i][k] = cnt
n -= 2 # 缩小规模时,矩形边长减2
return matrix
hm = Helix_Matrix(N)
prt(hm)
Resultados de:
1 | 2 | 3 | 4 | 5 |
dieciséis | 17 | 18 | 19 | 6 |
15 | 24 | 25 | 20 | 7 |
14 | 23 | 22 | 21 | 8 |
13 | 12 | 11 | 10 | 9 |
Volviendo al principio de la pregunta, entonces
def Helix_Matrix(N):
matrix = [] # 初始化二维矩阵matrix(二维列表)
for i in range(N):
matrix.append([])
for j in range(N):
matrix[i].append(0)
matrix[N//2][N//2] = N*N # 若N为奇数时,正中间为N²
cnt = 0
n = N
for k in range(N//2):
for j in range(n-1): # 矩形上边,从左向右
cnt += 1
matrix[k][k+j] = cnt
for i in range(n-1): # 矩形右边,从上往下
cnt += 1
matrix[k+i][k+n-1] = cnt
for j in range(n-1): # 矩形下边,从右向左
cnt += 1
matrix[k+n-1][k+n-1-j] = cnt
for i in range(n-1): # 矩形左边,从下往上
cnt += 1
matrix[k+n-1-i][k] = cnt
n -= 2 # 缩小规模时,矩形边长减2
return matrix
n, i, j = map(int,input().split())
hm = Helix_Matrix(n)
print(hm[i-1][j-1])
La entrada es 4 2 3 y la salida es 14.
4. Resolución de problemas recursiva
Cuando la escala sea 1, complete directamente (1 elemento), consulte " 2. Ideas de solución " y finalice la recursividad;
Cuando la escala sea 2, complete directamente (4 elementos), consulte " 2. Ideas de solución " y finalice la recursividad;
Cuando la escala es mayor que 2, escriba directamente los cuatro lados de este círculo (k) primero, consulte " 2. Ideas de solución " , luego reduzca la escala y llámela recursivamente.
Este es el algoritmo de cálculo recursivo.
El código del programa es el siguiente:
N = 6
def prt(b): # 打印二维列表
for i in range(N):
for j in range(N):
print("%3d" % b[i][j], end='')
print()
def Helix_Matrix(n,k,cnt):
if n == 1: # 规模为1
matrix[k][k] = cnt
elif n == 2: # 规模为2
matrix[k][k] = cnt
cnt += 1
matrix[k][k+1] = cnt
cnt += 1
matrix[k+1][k+1] = cnt
cnt += 1
matrix[k+1][k] = cnt
else: # 规模大于2
for j in range(n-1): # 矩形上边,由左向右
matrix[k][k+j] = cnt
cnt += 1
for i in range(n-1): # 矩形右边,由上往下
matrix[k+i][k+n-1] = cnt
cnt += 1
for j in range(n-1): # 矩形下边,由右向左
matrix[k+n-1][k+n-1-j] = cnt
cnt += 1
for i in range(n-1): # 矩形左边,由下往上
matrix[k+n-1-i][k] = cnt
cnt += 1
Helix_Matrix(n-2, k + 1, cnt) # 递归,缩小螺旋矩阵规模
matrix = [] # 初始化二维矩阵matrix(二维列表)
for i in range(N):
matrix.append([])
for j in range(N):
matrix[i].append(0)
Helix_Matrix(N,0,1) # 初始n=N, k=0, cnt=1
prt(matrix)
Resultados de:
1 | 2 | 3 | 4 | 5 | 6 |
20 | 21 | 22 | 23 | 24 | 7 |
19 | 32 | 33 | 34 | 25 | 8 |
18 | 31 | 36 | 35 | 26 | 9 |
17 | 30 | 29 | 28 | 27 | 10 |
dieciséis | 15 | 14 | 13 | 12 | 11 |
Volviendo al principio de la pregunta, entonces
def Helix_Matrix(n,k,cnt):
if n == 1: # 规模为1
matrix[k][k] = cnt
elif n == 2: # 规模为2
matrix[k][k] = cnt
cnt += 1
matrix[k][k+1] = cnt
cnt += 1
matrix[k+1][k+1] = cnt
cnt += 1
matrix[k+1][k] = cnt
else: # 规模大于2
for j in range(n-1): # 矩形上边,由左向右
matrix[k][k+j] = cnt
cnt += 1
for i in range(n-1): # 矩形右边,由上往下
matrix[k+i][k+n-1] = cnt
cnt += 1
for j in range(n-1): # 矩形下边,由右向左
matrix[k+n-1][k+n-1-j] = cnt
cnt += 1
for i in range(n-1): # 矩形左边,由下往上
matrix[k+n-1-i][k] = cnt
cnt += 1
Helix_Matrix(n-2, k + 1, cnt) # 递归,缩小螺旋矩阵规模
N, x, y = map(int,input().split())
matrix = [] # 初始化二维矩阵matrix(二维列表)
for i in range(N):
matrix.append([])
for j in range(N):
matrix[i].append(0)
Helix_Matrix(N,0,1) # 初始n=N, k=0, cnt=1
print(matrix[x-1][y-1])
La entrada es 4 2 3 y la salida es 14.