С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/259: Рейтинг темы: голосов - 259, средняя оценка - 5.00
6 / 4 / 2
Регистрация: 13.02.2019
Сообщений: 46

Заполнить матрицу по спирали

08.04.2019, 10:15. Показов 50989. Ответов 13

Студворк — интернет-сервис помощи студентам
Добрый день. есть задача. помогите с логикой решения задачи?

Выведите таблицу размером n×n, заполненную числами от 1 до n2 по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке.

Пример:

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9


Нужна помощь с логикой решения задачи, я понимаю что данную задачу можно решить через циклы (её и нужно решить через циклы)

есть понимание как сделать последовательность

Python
1
2
3
4
5
6
7
8
9
n = int(input())
my_lst = []
for i in range((n**2)+1):
    if i > 0:
        my_lst.append(i)
qube = []
for a in range(n+1):
    row_lst = []
    row_lst.append(my_lst[a])

вот что делать дальше?!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2019, 10:15
Ответы с готовыми решениями:

Заполнить матрицу по спирали
Матрицу mxn заполнить натуральными числами от 1 до mn по спирали, начинающейся в левом верхнем углу и закрученной по часовой стрелке.

Заполнить матрицу по спирали (по часовой стрелке)
Можете пожалуйста прокомментировать код? Не до конца понимаю что и как работает. Условие: заполнить матрицу по спирали (по часовой...

Заполнить матрицу по спирали, закрученной по часовой стрелке
По введенным значениям n, m (1 ≤ n ≤ 20, 1 ≤ m ≤ 20) заполните массив размерностью n × m числами от 1 до mn, расположив их по спирали,...

13
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
08.04.2019, 10:31
Недавно была такая тема. Ищите.
0
6 / 4 / 2
Регистрация: 13.02.2019
Сообщений: 46
08.04.2019, 10:48  [ТС]
Цитата Сообщение от ioprst Посмотреть сообщение
Недавно была такая тема. Ищите.
С решением не через циклы! а решить её нужно через циклы!
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
08.04.2019, 11:30
Цитата Сообщение от FedorovAleksei Посмотреть сообщение
С решением не через циклы! а решить её нужно через циклы!
смотрю на решение, которое уже есть на форуме, цикл там есть.
0
6 / 4 / 2
Регистрация: 13.02.2019
Сообщений: 46
08.04.2019, 12:48  [ТС]
Цитата Сообщение от ioprst Посмотреть сообщение
смотрю на решение, которое уже есть на форуме, цикл там есть.
если про данную тему: Заполнить массив по спирали. Заполнить массив по спирали
то я там ничего не понимаю, я не знаю что есть map, так как не проходил еще её или не в курсе даже что это! но хочу понять логику как сделать решение данной задачи через циклы.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
08.04.2019, 12:52
Я про это

Цитата Сообщение от FedorovAleksei Посмотреть сообщение
я не знаю что есть map
для этого есть интернет
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.04.2019, 13:03
Цитата Сообщение от FedorovAleksei Посмотреть сообщение
for i in range((n**2)+1): if i > 0: my_lst.append(i)
Не надо так. Просто range(1, ...).

Добавлено через 1 минуту
Цитата Сообщение от FedorovAleksei Посмотреть сообщение
вот что делать дальше?!
Дальше - варианты. Можно поискать на этом форуме, ибо эту задачу очень часто спрашивают.
Можно решить самому, для этого составить словесный рецепт, как бы вы решали на бумажке.
0
6 / 4 / 2
Регистрация: 13.02.2019
Сообщений: 46
08.04.2019, 13:18  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Не надо так. Просто range(1, ...).
не очень понимаю как это мне поможет, я хочу понять как сделать так что бы данные сами закручивались спираль, на бумажке я не использую адреса, но пока умею использовать адреса строк и столбцов.

Добавлено через 9 минут
Я хочу понять логику заполнения, именно логику, мне даже код не нужен, я его сам напишу, он конечно не будет коротким 10000% но он будет мне понятным
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.04.2019, 13:25
Цитата Сообщение от FedorovAleksei Посмотреть сообщение
не очень понимаю как это мне поможет, я хочу понять как сделать так что бы данные сами закручивались спираль,
В этом куске кода вы делаете список идущих подряд чисел.

Цитата Сообщение от FedorovAleksei Посмотреть сообщение
Я хочу понять логику заполнения, именно логику,
Я понимаю, потому и дал совет - формализуйте, как бы вы делали эту задачу "на бумаге". Клетчатый листок, квадрат, вписывайте числа ручкой.
1
6 / 4 / 2
Регистрация: 13.02.2019
Сообщений: 46
08.04.2019, 13:30  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Я понимаю, потому и дал совет - формализуйте, как бы вы делали эту задачу "на бумаге". Клетчатый листок, квадрат, вписывайте числа ручкой.
на бумаге то понятно, а как быть с размерностью?! у меня на бумаге 43 если получилось, а в предложенном ссылкой выше всего 5, да и как лихо матрица из 0 создана, а вот дальнейшая адресация, мне никак не понятна....

Добавлено через 1 минуту
Python
1
2
3
4
5
6
7
8
    if i<=j+1 and i+j<n-1: 
        j+=1
    elif i<j and i+j>=n-1: 
        i+=1
    elif i>=j and i+j>n-1: 
        j-=1
    elif i>j+1 and i+j<=n-1: 
        i-=1
данный кусок мне не понятен вообще, принцип адресации.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.04.2019, 13:39
Цитата Сообщение от FedorovAleksei Посмотреть сообщение
на бумаге то понятно,
Ну значит непонятно.
Цитата Сообщение от FedorovAleksei Посмотреть сообщение
а как быть с размерностью?! у меня на бумаге 43 если получилось,
Не понимаю, что с размерностью. 43 чего?

В общем, похоже, мне пора закругляться, советы не особо востребованы.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
08.04.2019, 14:12
Вот моя бредовая реализация, может ее сможете понять.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
r = 3
c = 7
 
mas = [[0]*c for _ in range(r)]
 
i = 0
j = 0
 
num = 1
 
right = True
down = False
left = False
up = False
 
def zero(mas):
    for row in mas:
        if 0 in row:
            return True
    return False
 
while zero(mas):
    if mas[i][j] == 0:
        mas[i][j] = num
        num += 1
 
    if j < c-1 and mas[i][j+1] == 0 and right:
        j += 1
 
    elif i < r-1 and mas[i+1][j] == 0 and down:
        i += 1
 
    elif j >= 0 and mas[i][j-1] == 0 and left:
        j -= 1
 
    elif i >= 0 and mas[i-1][j] == 0 and up:
        i -= 1
    elif right:
        right = False
        down = True
 
    elif down:
        down = False
        left = True
 
    elif left:
        left = False
        up = True
 
    elif up:
        up = False
        right = True
 
for row in mas:
    print(row)
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.04.2019, 18:12
Лучший ответ Сообщение было отмечено FedorovAleksei как решение

Решение

Эх, тряхнём стариной. Моё решение. Постарался сделать максимально модульным. Разбавить по вкусу.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from itertools import cycle
n = 5
 
 
directions = ((1, 0), (0, -1), (-1, 0), (0, 1))
 
nums = range(1, n*n+1)
 
def length_producer(_max):
    curr_l = _max
    while curr_l > 0:
        yield curr_l
        curr_l -=1
        yield curr_l
 
 
print(list(length_producer(n)), sum(list(length_producer(n))))
 
buffer = []
for i in range(n):
    buffer.append([None]*n)
 
print(buffer)
 
curr_i, curr_j = -1, n-1
 
values_iterator = iter(nums)
 
for l, d in zip(length_producer(n), cycle(directions)):
    print(l, d)
    for i in range(l):
        num = next(values_iterator)
        curr_i += d[0]
        curr_j += d[1]
        buffer[curr_i][curr_j] = num
 
for line in buffer:
    print(line)
2
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
09.04.2019, 07:48
UPD:
Python
1
2
while num < c*r + 1:
    ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2019, 07:48
Помогаю со студенческими работами здесь

Заполнить матрицу размером n × m числами от 1 до m*n, расположив их по спирали, закрученной по часовой стрелке
Добрый день. Пытался сделать программу но не получилось. Можете подсказать что сделать. А то совсем уже голова не работает. Задачка...

Заполнить массив по спирали
По введенным значениям n, m (1 ≤ n ≤ 20, 1 ≤ m ≤ 20) заполните массив размерностью n × m числами от 1 до mn, расположив их по спирали,...

Заполнить массив по спирали
условия задачи: даны N и M длина и ширина двумерного массива. Мы заполняем массив по спирали далее на вход нам идут координаты X и Y...

Заполнить двумерный массив по спирали
Заполнить двумерный массив размерности NxN (N-с клавиатуры) по аналогу: 789 612 543 то есть последний элемент первой строки...

Как заполнить прямоугольный массив по спирали
ПОМОГИТЕЕЕЕ есть массив: for j in range(lenght)] for i in range(weight)] Его нужно заполнить по спирали. Везде описано как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru