Изучение нескольких методов печати матрицы в спиральном порядке

Печать матрицы по спирали — распространенная проблема в компьютерном программировании и алгоритмических собеседованиях. Он предполагает перемещение двумерной матрицы по спирали по часовой стрелке и печать ее элементов в этом порядке. В этой статье мы рассмотрим несколько методов решения этой проблемы, приведя попутно примеры кода.

Метод 1: итеративный подход
Один простой способ распечатать матрицу в спиральном порядке — использовать итеративный подход. Мы поддерживаем четыре переменные: top, bottom, leftи right, представляющие индексы границ текущая спираль. Мы перебираем матрицу, печатая элементы в нужном порядке, пока не будет пройдена вся матрица.

def print_spiral(matrix):
    top = 0
    bottom = len(matrix) - 1
    left = 0
    right = len(matrix[0]) - 1
    while top <= bottom and left <= right:
        # Print top row
        for i in range(left, right + 1):
            print(matrix[top][i], end=" ")
        top += 1
        # Print right column
        for i in range(top, bottom + 1):
            print(matrix[i][right], end=" ")
        right -= 1
        # Print bottom row
        if top <= bottom:
            for i in range(right, left - 1, -1):
                print(matrix[bottom][i], end=" ")
            bottom -= 1
        # Print left column
        if left <= right:
            for i in range(bottom, top - 1, -1):
                print(matrix[i][left], end=" ")
            left += 1
# Testing the method
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print_spiral(matrix)

Метод 2: рекурсивный подход
Другой подход к печати матрицы в спиральном порядке — использование рекурсивной функции. Идея состоит в том, чтобы распечатать текущие граничные элементы, а затем рекурсивно вызывать функцию для внутренней подматрицы, пока не будет пройдена вся матрица.

def print_spiral_recursive(matrix, top, bottom, left, right):
    if top > bottom or left > right:
        return
    # Print top row
    for i in range(left, right + 1):
        print(matrix[top][i], end=" ")
    top += 1
    # Print right column
    for i in range(top, bottom + 1):
        print(matrix[i][right], end=" ")
    right -= 1
    # Print bottom row
    if top <= bottom:
        for i in range(right, left - 1, -1):
            print(matrix[bottom][i], end=" ")
        bottom -= 1
    # Print left column
    if left <= right:
        for i in range(bottom, top - 1, -1):
            print(matrix[i][left], end=" ")
        left += 1
    # Recursive call for the inner sub-matrix
    print_spiral_recursive(matrix, top, bottom, left, right)
# Testing the method
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print_spiral_recursive(matrix, 0, len(matrix) - 1, 0, len(matrix[0]) - 1)

Метод 3: транспонирование и обратное
Альтернативный подход — транспонировать матрицу, а затем перевернуть строки. При этом строки печатаются в нужном порядке.

def print_spiral_transpose_reverse(matrix):
    rows = len(matrix)
    cols = len(matrix[0])
    # Transpose the matrix
    matrix = [[matrix[j][i] for j in range(rows)] for i in range(cols)]
    # Reverse the rows
    matrix = matrix[::-1]
    # Print the elements
    for row in matrix:
        for element in row:
            print(element, end=" ")
# Testing the method
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print_spiral_transpose_reverse(matrix)

В этой статье мы рассмотрели три различных метода печати матрицы по спирали. Итеративный подход, рекурсивный подход и подход транспонирования-обратного подхода предлагают разные способы решения проблемы. Понимая эти методы, вы сможете решать аналогичные задачи обхода матрицы в своем путешествии по программированию.