[Pregunta de algoritmo] Matriz espiral IV (Resolución de matriz serpentina poligonal de orden n)

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≤ in ), j (1≤ jn ). 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:

 

Supongo que te gusta

Origin blog.csdn.net/hz_zhangrl/article/details/132307297
Recomendado
Clasificación