Как я могу использовать al oop, чтобы получить вывод по часовой стрелке в матрице в качестве независимого вывода? - PullRequest
1 голос
/ 27 мая 2020

Это изображение объясняет проблему, которую я пытаюсь решить.

И вот моя попытка решения:

matrix = [[1, 2, 3, 4, 5],
      [6, 7, 8, 9, 10],
      [11, 12, 13, 14, 15],
      [16, 17, 18, 19, 20]]
i = 0
y = (len(matrix)-1)
while i < len(matrix):
    if i == 0:
        # print 1st row.
        for rows in matrix[i]:
            print(rows)

    # print all the last element of every rows, except 1st and last row.
    elif i != 0 and i != y:
        print(matrix[i][-1])

    # print the last row in reverse.
    elif i == y and i != 0:
        matrix[i].sort(reverse=True)
        for row in matrix[i]:
            print(row)

        print(matrix[i-1][0])       # print the 1st element of 3rd row.

        # print the 1st four elements of 2nd row.
        for r in matrix[1][0:4]:
            print(r)

        # finally print the rest of the elements in reverse.
        matrix[2].sort(reverse=True)
        for r_remain in matrix[2][1:4]:
            print(r_remain)

    i += 1

Мой вопрос, это алгоритм правильно или неправильно?

Во-вторых, мой алгоритм зависит от размера и содержимого входной матрицы. Как заставить его работать на любом входе?

Ответы [ 2 ]

0 голосов
/ 01 июня 2020

Вот совершенно общее решение, работающее для любого количества строк:

matrix = [[ 1,  2,  3,  4,  5],
          [12, 13, 14, 15,  6],
          [11, 10,  9,  8,  7]]

# print rows between lo_x..hi_x and columns between lo_y..hi_y (inclusive)
lo_x = lo_y = 0
hi_x = len(matrix[0]) - 1
hi_y = len(matrix) - 1

while lo_x <= hi_x and lo_y <= hi_y:
    for x in range(lo_x, hi_x+1): print(matrix[lo_y][x])
    lo_y += 1
    for y in range(lo_y, hi_y+1): print(matrix[y][hi_x])
    hi_x -= 1
    if not (lo_x <= hi_x and lo_y <= hi_y): break
    for x in reversed(range(lo_x, hi_x+1)): print(matrix[hi_y][x])
    hi_y -= 1
    for y in reversed(range(lo_y, hi_y+1)): print(matrix[y][lo_x])
    lo_x += 1

На каждой итерации мы делаем одну спираль (вправо, вниз, влево, вверх). break в середине необходим, потому что у нас может остаться x-диапазон, даже когда наш y-диапазон израсходован. Я добавил матрицу в качестве примера того, зачем нужен break (при удалении break будет выдан ложный результат).

0 голосов
/ 01 июня 2020

Можно получить очень короткое решение, используя numpy, хотя, возможно, это не в духе задания (библиотека выполняет большую часть работы):

import numpy

matrix = [[ 1,  2,  3,  4,  5],
          [14, 15, 16, 17,  6],
          [13, 20, 19, 18,  7],
          [12, 11, 10,  9,  8]]

def recurse(matrix):
    if not len(matrix): return
    for el in matrix[0]: print(el)
    recurse(numpy.rot90(matrix[1:]))

recurse(numpy.array(matrix))
...