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

1. Planteando la pregunta

Un rasgo característico de una matriz serpentina de orden n es que los elementos están dispuestos 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. Las reglas para completar números son del  1  al n × n .     

Figura 1   Matriz espiral (matriz de serpiente) con n filas y n 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. Un total de una línea, incluidos tres números enteros n ( 1 n1 , 000 ), i ( 1 in ), j ( 1 jn ), cada dos números enteros están separados por un espacio, lo que indica respectivamente El tamaño de la matriz, el número de fila y el número de columna del número que se va 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

43

Instrucciones/Consejos

Subtareas

  • Para  el 30%  de los datos de prueba, n10 ;
  • Para  el 60%  de los datos de prueba, n100 ;
  • Para  el 100% de  los datos de prueba, n1.000 ;
  • En particular, para  el 20%  de los datos de prueba, i = j = 1 .

pista

De acuerdo con las reglas de llenado de esta pregunta, una  matriz en espiral de 8 × 8  debería verse así (como se muestra en la Figura 2):

Figura 2 Matriz espiral (matriz de serpiente) con 8 filas y 8 columnas

 2. Ideas para resolver problemas

Como puede verse en la Figura 3, se trata de una matriz en forma de Z girada 45º. Por supuesto, las longitudes de retorno no son iguales. Mire detenidamente la Figura 1 y encontrará que al completar números en la parte superior derecha, si el número de fila es 0, vaya a la derecha (el número de fila permanece sin cambios y el número de columna aumenta en 1); si el número de columna llega n, vaya hacia abajo (el número de columna disminuye en 1 y el número de fila disminuye) número más 1), luego complete el número en la parte inferior izquierda. En este momento, si el número de columna es 0, baje, si la fila el número llega a n, vaya a la derecha (el número de fila menos 1, el número de columna más 1) y luego complete el lado derecho. Cuente y repita hasta completar la última fila y columna.

Figura 3 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 desde abajo a la izquierda hasta arriba a la derecha.

Al pasar de abajo a la izquierda a arriba a la derecha, si el número de fila ya es 0 , el número de columna se incrementará en 1 en la dirección opuesta ( de arriba a la derecha a abajo a la izquierda ) . De lo contrario, el número de fila se reducirá en 1 y el el número de columna se incrementará en 1. Si el número de columna llega a n , el número de columna será n-1 , el número de línea más 1 está en la dirección opuesta ( de arriba a la derecha a abajo a la izquierda ) .

Al pasar de la parte superior derecha a la inferior izquierda, si el número de la columna ya es 0 , el número de la fila se incrementará en 1 en la dirección opuesta ( de la parte inferior izquierda a la superior derecha ) . De lo contrario, el número de la fila se incrementará en 1 y el el número de columna se reducirá en 1. Si el número de fila llega a n , el número de columna se incrementará en 1. El número de fila es n-1 y la dirección se invierte ( de abajo a la izquierda a arriba a la derecha ) .

Termina cuando el número de fila y el número de columna son ambos n-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 == n-1 and j == n-1:
            break
        if k == 1:           # 从左下往右上 
            if i == 0 :
                j += 1
                if j >= n:
                    j = n-1
                    i = i+1 if i < n -1 else n-1
                k = -1
            elif j == n-1:
                i += 1
                k = -1
            else:
                i -= 1
                j += 1
        else:                # 从右上往左下
            if j == 0 :
                i += 1
                if i >= n:
                    i = n-1
                    j = j+1 if j < n -1 else n-1
                k = 1
            elif i == n-1:
                j += 1
                k = 1
            else:
                i += 1
                j -= 1
        cnt += 1
            
N = 7
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 == n-1 and j == n-1:
            break
        if k == 1:        # 从左下往右上
            if i == 0 :
                j += 1
                if j >= n:
                    j = n-1
                    i = i+1 if i < n -1 else n-1
                k = -1
            elif j == n-1:
                i += 1
                k = -1
            else:
                i -= 1
                j += 1
        else:             # 从右上往左下
            if j == 0 :
                i += 1
                if i >= n:
                    i = n-1
                    j = j+1 if j < n -1 else n-1
                k = 1
            elif i == n-1:
                j += 1
                k = 1
            else:
                i += 1
                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/132262026
Recomendado
Clasificación