Заполнение матрицы спиралью

Natalia Vishnevskaya

Новичок
Пользователь
Июл 13, 2021
3
1
1
Задача:
На вход программе подаются два натуральных числа n и m. Напишите программу, которая создает матрицу размером n * m заполнив её "спиралью" в соответствии с образцом.

Sample Input 1:

4 5
Sample Output 1:

1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
Sample Input 2:

1 6
Sample Output 2:

1 2 3 4 5 6
Sample Input 3:

3 3
Sample Output 3:

1 2 3
8 9 4
7 6 5

Не совсем понимаю какой алгоритм следует создать. Если вы в ресурсе именно ОБЪЯСНИТЬ его, или оставить ссылки на источники, где об этом можно прочитать, буду рада.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 669
477
83
из моего личного решебника)

Python:
n, m = map(int, input().split())
a = [[0] * m for _ in range(n)]

i, j, d = 0, 0, 0
moves = ((0, 1,), (1, 0,), (0, -1,), (-1, 0,),)
for k in range(1, n * m + 1):
    a[i][j] = k
    for l in range(4):
        newD = (d + l) % 4
        di, dj = moves[newD]
        newI, newJ = i + di, j + dj
        if 0 <= newI < n and 0 <= newJ < m and a[newI][newJ] == 0:
            i, j, d = newI, newJ, newD
            break
for row in a:
    print(*row)
 

Natalia Vishnevskaya

Новичок
Пользователь
Июл 13, 2021
3
1
1
Python:
def spiral(matrix):
    result = []   #список с итоговыми значениями
    rows = len(matrix)    # рядочки
    if rows == 0:   # проверка
        return result
    a = 0  # столбцы
    colIndex = len(matrix[0]) - 1 # колоночки
    b = 0 # рядки
    rowIndex = rows - 1 # ряды
    while a <= colIndex and b <= rowIndex: # пока рядки и колонки не сравняются между собой
        for i in range(a, colIndex + 1): # работаем с первой строчкой / направление - направо
            result.append(matrix[a][i])  # к результируещиему списку добавляем элементы
        b += 1
        for i in range(b, rowIndex + 1):  # направление - вниз
            result.append(matrix[i][colIndex]) #добавляем к результируещиему списку
        colIndex -= 1 #cужаем границу
        if b <= rowIndex:  #если есть число в рамке
            for i in range(colIndex, a - 1, -1):
                result.append(matrix[rowIndex][i])
            rowIndex -= 1
        if a <= colIndex:
            for i in range(rowIndex, b - 1, -1):
                result.append(matrix[i][a])
            a += 1
    return result
def chunked(sp, n):
    return [sp[x:x + n] for x in range(0,len(sp),n)]
u = [int(g) for g in input().split()]
n, m = u[0], u[1]
mat = [[0 for _ in range(m)] for _ in range(n)]
counter = 1
for k in range(n):
    for o in range(m):
        mat[k][o] = counter
        counter += 1
mat = spiral(mat)
print(mat)
Пока что я пришла к такому решению, но его придется доработать. Проблема с выводом.
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Я так понимаю, это вопрос со Stepik, какой смысл его задавать? Понятно что дадут решение, но задачи нужны, чтобы самому тренироваться его находить.
 

Natalia Vishnevskaya

Новичок
Пользователь
Июл 13, 2021
3
1
1
Я так понимаю, это вопрос со Stepik, какой смысл его задавать? Понятно что дадут решение, но задачи нужны, чтобы самому тренироваться его находить.
Добрый день! Да задача со Степика. Но если вы прочитаете саму просьбу, то там говорится о ссылке на источники и об объяснении задачи. У меня в приоритете, понять задачу. Также я выложила вариант решения, который выводит ответ в виде списка, а должно выводить в виде матрицы.
 
  • Мне нравится
Реакции: Vershitel_sudeb

Форум IT Специалистов