Печать матрицы по спирали — распространенная проблема в компьютерном программировании и алгоритмических собеседованиях. Он предполагает перемещение двумерной матрицы по спирали по часовой стрелке и печать ее элементов в этом порядке. В этой статье мы рассмотрим несколько методов решения этой проблемы, приведя попутно примеры кода.
Метод 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)
В этой статье мы рассмотрели три различных метода печати матрицы по спирали. Итеративный подход, рекурсивный подход и подход транспонирования-обратного подхода предлагают разные способы решения проблемы. Понимая эти методы, вы сможете решать аналогичные задачи обхода матрицы в своем путешествии по программированию.