1. Planteando la pregunta
La matriz serpentina en zigzag de orden n se caracteriza por disponer los elementos de la manera que se muestra en la Figura 1. Una matriz serpentina de orden n significa que el tamaño de la matriz es n × n , donde n es un número entero positivo.
Antecedentes de la pregunta
Se puede generar una matriz en espiral con n filas y n columnas mediante el método que se muestra en la Figura 1. Observe la imagen y descubra el patrón de relleno. La regla de llenado es comenzar desde 1 hasta n × n .
Figura 1 Matriz espiral con 8 filas y 8 columnas
Ahora, dado el tamaño de la matriz n , i y j , busque el número en la i - ésima fila y la j -ésima columna de la matriz.
Descripción de la pregunta
ninguno
Formato de entrada
Leer datos de la entrada estándar. Hay una línea que contiene tres números enteros n (1≤ n ≤ 1,000), i (1≤ i ≤ n ), j (1≤ j ≤ n ). Cada dos números enteros están separados por un espacio, lo que indica el tamaño de la matriz. respectivamente. , el número de fila y el número de columna donde se encuentra el número a encontrar.
Formato de salida
Salida a salida estándar. Un número entero que representa el número en la fila i y la columna j en la matriz correspondiente .
Muestras de entrada y salida
Ingrese #1 para copiar
8 2 8
Salida #1 Copia
51
Instrucciones/Consejos
Subtareas
Para el 30% de los datos de prueba, n ≤ 10; para el 60% de los datos de prueba, n ≤ 100; para el 100% de los datos de prueba, n ≤ 1000; específicamente, para el 20% de los datos de prueba, i = j = 1.
2. Ideas para resolver problemas
Como puede verse en la Figura 2, se trata de una matriz serpentina con giros horizontales y verticales. Mire detenidamente la Figura 2 y encontrará que: cuando esté en la fila 1 (el número de fila es 0), complete el número de la derecha (el número de fila permanece sin cambios y el número de columna aumenta en 1), y luego hacia abajo. Cuando los valores de fila y fila sean iguales, gire hacia la izquierda. Si el número de columna es Cuando llega a 0, baje (número de fila más 1), luego complete el número a la derecha. Si la fila y los valores de las filas son iguales, suba. Si el número de fila llega a 0, vaya hacia la derecha (el número de fila permanece sin cambios, el número de columna más 1), y luego hacia abajo, repita hasta la columna 0 de la última fila, o la fila 0 de la última columna.
Figura 2 Diagrama de análisis de matriz serpentina
3. Algoritmo de generación de matrices
Hay n filas yn columnas , la primera fila es la fila 0 y la primera columna es la columna 0 . A partir de 1 en (0, 0) , la dirección se establece hacia arriba.
Cuando apunta hacia arriba, si el número de fila ya es 0 , el número de columna aumenta en 1 y la dirección se invierte ( hacia abajo ) ; de lo contrario, el número de fila disminuye en 1. Si el número de columna es n-1 y el número de fila es 0 , el relleno está completo.
Al bajar, si el número de columna == número de fila, gire ( hacia la izquierda ) ; de lo contrario, el número de fila aumenta en 1 .
Al moverse hacia la izquierda, si el número de columna ya es 0 , el número de fila se incrementará en 1 y la dirección se invertirá ( hacia la derecha ) ; de lo contrario, el número de columna se reducirá en 1. Si el número de fila es n- 1 y el número de columna es 0 , se completará el llenado.
Al ir hacia la derecha, si el número de fila == número de columna , gire ( hacia arriba ) ; de lo contrario, el número de columna aumenta en 1 .
El código del programa es el siguiente:
def prt(hm): # 打印二维列表
for i in range(N):
for j in range(N):
print("%3d" % hm[i][j], end='')
print()
def Helix_MatrixII(n):
cnt = 1
i = j = 0
k = 1
while True:
matrix[i][j] = cnt
if (i == 0 and j >= n-1 and k == 1) or (i >= n-1 and j == 0 and k == 3):
break # 向上填写时,最后1列并到0行 或 向左填写时,最后1行并到0列
if k == 0: # 向右填写
j +=1
if i == j: # 转向向上
k = 1
elif k == 1: # 向上填写
if i == 0: # 到0时,转下一列调头
j += 1
k = 2
else:
i -=1
elif k == 2: # 向下填写
i +=1
if i == j: # 转向向左
k = 3
elif k == 3: # 向左填写
if j == 0: # 到0时,转下一行调头
i += 1
k = 0
else:
j -=1
cnt += 1
N = 6
matrix = [] # 初始化二维矩阵matrix(二维列表)
for i in range(N):
matrix.append([])
for j in range(N):
matrix[i].append(0)
Helix_MatrixII(N)
prt(matrix)
Resultados de:
4. Algoritmo de resolución de problemas
La pregunta requiere ingresar tres parámetros: tamaño de la matriz n y coordenadas (i, j), para encontrar el valor del elemento en la matriz (i, j). Entonces, primero encuentre la matriz por n y ahora genere los valores de los elementos por coordenadas.
El código del programa es el siguiente:
def Helix_MatrixII(n):
cnt = 1
i = j = 0
k = 1
while True:
matrix[i][j] = cnt
if (i == 0 and j >= n-1 and k == 1) or (i >= n-1 and j == 0 and k == 3):
break # 向上并最后1列到第0行 或 向左并最后1行到第0列
if k == 0: # 向右填写
j +=1
if i == j: # 转向向上
k = 1
elif k == 1: # 向上填写
if i == 0: # 向上到0行,列号加1并转向下
j += 1
k = 2
else:
i -=1
elif k == 2: # 向下填写
i +=1
if i == j: # 转向向左
k = 3
elif k == 3: # 向左填写
if j == 0: # 向左到0列,行号加1并转向右
i += 1
k = 0
else:
j -=1
cnt += 1
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_MatrixII(N)
print(matrix[x-1][y-1])
Resultados de: