Как отформатировать данный массив (матрицу) по спирали (спиральная сортировка по улитке или по часовой стрелке) в Python

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

# Example 1.
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# Expected = [1, 2, 3, 6, 9, 8, 7, 4, 5]
print some_function(matrix)
# Example 2.
matrix = [
[1,  2 , 3,  4,  5 ],
[6,  7 , 8 , 9,  10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]
]
# Expected = [1, 2, 3, 4, 5, 10, 15, 20, 19, 18, 17, 16, 11, 6, 7, 8, 9, 14, 13, 12]
print some_function(matrix)

Если вы все еще не получили его, посмотрите графическое объяснение на изображении этой статьи, где вы можете увидеть стрелку, следующую за структурированным массивом в форме улитки.

Реализация

Данная структура всегда будет одним массивом с несколькими массивами внутри, поэтому вы можете работать с ним как с квадратичным объектом, повторяющимся по всей строке и использующим некоторые флаги для возврата к каждой строке в соответствии с состоянием сгенерированного массива:

"""
Given a matrix of m x n elements (m rows, n columns),
return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
It should return [1,2,3,6,9,8,7,4,5].
"""
def spiral_traversal(matrix):
res = []
if len(matrix) == 0:
return res
row_begin = 0
row_end = len(matrix) - 1
col_begin = 0
col_end = len(matrix[0]) - 1
while row_begin <= row_end and col_begin <= col_end:
for i in range(col_begin, col_end+1):
res.append(matrix[row_begin][i])
row_begin += 1
for i in range(row_begin, row_end+1):
res.append(matrix[i][col_end])
col_end -= 1
if row_begin <= row_end:
for i in range(col_end, col_begin-1, -1):
res.append(matrix[row_end][i])
row_end -= 1
if col_begin <= col_end:
for i in range(row_end, row_begin-1, -1):
res.append(matrix[i][col_begin])
col_begin += 1
return res

С помощью этой функции вы сможете структурировать исходный массив с нужной формой:

mat = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# [1, 2, 3, 6, 9, 8, 7, 4, 5]
print(spiral_traversal(mat))
Ссылка на основную публикацию
Adblock
detector