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

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

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

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

Выведите таблицу размером 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2019, 10:15
Ответы с готовыми решениями:

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

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

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

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

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

Цитата Сообщение от FedorovAleksei Посмотреть сообщение
я не знаю что есть map
для этого есть интернет
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,133
Записей в блоге: 6
08.04.2019, 13:03 7
Цитата Сообщение от 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  [ТС] 8
Цитата Сообщение от dondublon Посмотреть сообщение
Не надо так. Просто range(1, ...).
не очень понимаю как это мне поможет, я хочу понять как сделать так что бы данные сами закручивались спираль, на бумажке я не использую адреса, но пока умею использовать адреса строк и столбцов.

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

Цитата Сообщение от FedorovAleksei Посмотреть сообщение
Я хочу понять логику заполнения, именно логику,
Я понимаю, потому и дал совет - формализуйте, как бы вы делали эту задачу "на бумаге". Клетчатый листок, квадрат, вписывайте числа ручкой.
1
6 / 4 / 2
Регистрация: 13.02.2019
Сообщений: 46
08.04.2019, 13:30  [ТС] 10
Цитата Сообщение от 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
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,133
Записей в блоге: 6
08.04.2019, 13:39 11
Цитата Сообщение от FedorovAleksei Посмотреть сообщение
на бумаге то понятно,
Ну значит непонятно.
Цитата Сообщение от FedorovAleksei Посмотреть сообщение
а как быть с размерностью?! у меня на бумаге 43 если получилось,
Не понимаю, что с размерностью. 43 чего?

В общем, похоже, мне пора закругляться, советы не особо востребованы.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
08.04.2019, 14:12 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
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,133
Записей в блоге: 6
08.04.2019, 18:12 13
Лучший ответ Сообщение было отмечено 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 14
UPD:
Python
1
2
while num < c*r + 1:
    ...
0
09.04.2019, 07:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2019, 07:48
Помогаю со студенческими работами здесь

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

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

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

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

Заполнить массив 3х3 числами по возрастанию, по спирали начиная с центра
Заполнить массив 3х3 числами по возрастанию, по спирали начиная с центра. 7 8 9 6 1 2 5 4 3

Заполнить матрицу по спирали
Здравствуйте, я уже не знаю как можно это решить, поскольку у меня всё плохо с матрицами можете...

Заполнить по спирали квадратную матрицу натуральными числами
Составить программу, которая заполняет квадратную матрицу порядка п натуральными числами 1, 2, 3,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru