[Pregunta de algoritmo] Matriz espiral I (resolver el problema de matriz espiral de orden n)

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 \izquierda ( 1 \derecha );

Cuando N=2, la matriz es \begin{pmatrix} 1&2\\ 4&3 \end{pmatrix};

Cuando N>2 (N es un número par como N=4), la matriz es \begin{pmatrix} 1&2&3&4\\ 12&13&14&5\\ 11&16&15&6\\ 10&9&8&7 \end{pmatrix};


Cuando N>2 (N es un número impar como N=5), la matriz es \begin{pmatrix} 1&2&3&4&5\\ 16&17&18&19&6\\ 15&24&25&20&7\\ 14&23&22&21&8\\ 13&12&11&10&9 \end{pmatrix}.

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.

Supongo que te gusta

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