Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 18.10.2023
Сообщений: 7

Реализация двумерных списков

11.02.2024, 21:33. Показов 863. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Попалась тут задание - реализовать матрицу, элементы которой будут располагаться в виде спирали.
У меня получилось сделать это на С++, но когда "переносил" это на Питон получилась такая ситуация, что при выводе матрицы программа делала дополнительный пропуск строки (или доп. \n).
Сам очень не силён в Питоне, поэтому часто приходится делать задания через процесс "С++ -> Питон".
Может я не правильно/грамотно инициализирую матрицу, или вывожу не правильно. Подскажите направление в котором стоит подумать (чтобы хотя бы проще понять и в будущем использовать без особых проблем). Заранее спасибо
Вот код программы:
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
def rotare_matrix(s, mtrx):
    newarr = [[0] * s for i in range(s)]
    for i in range(s):
        for j in range(s):
            newarr[i][j] = mtrx[i][j]
    
    for i in range(s):
        row = 0; clmn = (s - 1) - i
        
        for j in range(s):
            mtrx[i][j] = newarr[row][clmn]
            row += 1
 
def fill_row(mtrx, l, r, s):
    for i in range(l, r, 1):
        if ((i == 0) and (s == 0)) and (mtrx[s + 1][i] == 1):
            mtrx[s][i] = 1
        else:
            mtrx[s][i] = mtrx[s][i - 1] + 1
 
def print_matrix(s, mtrx):
    for i in range(s):
        for j in range(s):
            print(mtrx[i][j], end=' ')
        print("\n")
 
n = int(input())
arr = [[0] * n for i in range(n)]
 
lpos = 0; rpos = 0; row = 0
lposcor = 3; rposcor = 1; numrtr = 0
 
while (numrtr < n * 2):
    lpos = 0 + (lposcor // 4)
    rpos = n - (rposcor // 4)
 
    if (numrtr == 0):
        row = 0
    else:
        if (numrtr % 4 == 0):
            row += 1
 
    fill_row(arr, lpos, rpos, row)
    rotare_matrix(n, arr)
 
    numrtr += 1; lposcor += 1; rposcor += 1
 
while (arr[0][0] != 1):
    rotare_matrix(n, arr)
 
print_matrix(n, arr)
Смысл в чём : делаем матрицу ; заполняем первый ряд ; "поворачиваем" матрицу налево ; далее "прыгаем" от строки (ряда, который заполняем), левой и правой позиций (левые и правые столбцы, которые уже заполнены числами от пред. заполнений строки).
Сделано деревяно, но сделано.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2024, 21:33
Ответы с готовыми решениями:

Реализация двумерных списков
Дан массив А. Найти строку, сумма элементов которой минимальна, и умножить на минимальную сумму каждый элемент матрицы.

Разработать приложение по обработке двумерных числовых списков (массивов)
Здравствуйте. Помогите, пожалуйста, с решением данной задачи. Условие задачи: Разработать приложение по обработке двумерных...

Реализация списков в компьютере
Задание: 1. инициализация списка: присвоение текущему и начальному указателю неопределенного значения; 2. помещение в список элемента:...

5
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
11.02.2024, 22:36
Цитата Сообщение от IsenceonlyCPP Посмотреть сообщение
Смысл в чём
)) Лучше оригинал условия задачи приведите, ну или пример.
0
0 / 0 / 0
Регистрация: 18.10.2023
Сообщений: 7
11.02.2024, 23:37  [ТС]
Выведите таблицу размером n * n, заполненную числами от 1 до n^2 по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке.
n = 5

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
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
12.02.2024, 04:51
Лучший ответ Сообщение было отмечено IsenceonlyCPP как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def get_spiral(n):
    m = 1j
    e = cell_v = 1
    matr = [[0] * n for _ in range(n)]
    i = j = 0
    while True:
        matr[i][j] = cell_v
        if cell_v == n*n:
            return matr
        cell_v += 1
        if i+j == n-1 or i == j and i >= (n+1)//2 or i-j == 1 and i <= n//2:
            e *= m
        j += int(e.real)
        i += int(e.imag)
 
n = int(input('n = '))
matr = get_spiral(n)
for row in matr:
    for k in row:
        print(f'{k}\t', end='')
    print()
1
0 / 0 / 0
Регистрация: 18.10.2023
Сообщений: 7
18.02.2024, 16:02  [ТС]
Цитата Сообщение от idealist Посмотреть сообщение
matr = [[0] * n for _ in range(n)]
Тут сначала был очень большой вопрос к логике, так как использование '_' вместо какой-то переменной было для меня в новинку.
Как оказалось, этим можно спокойно пользоваться, так как Питон считает это как переменную void (мне так кажется).

Цитата Сообщение от idealist Посмотреть сообщение
if i+j == n-1 or i == j and i >= (n+1)//2 or i-j == 1 and i <= n//2:
            e *= m
        j += int(e.real)
        i += int(e.imag)
Эта часть кода мне вообще не поддаётся... Единственное, что могу предположить - это обход матрицы по кругу, резко переходя от одной стороны к другой. Но что происходит дальше...

Цитата Сообщение от idealist Посмотреть сообщение
for row in matr:
    for k in row:
        print(f'{k}\t', end='')
    print()
Вот тут спасибо за подсказку к выводу без лишних пробелов. Оказывается, всё дело было в "\n", который и делал лишнюю строку-пробел. А вот сам print() уже сам делает обычный переход на следующую строку.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
18.02.2024, 18:02
Цитата Сообщение от IsenceonlyCPP Посмотреть сообщение
Python
1
matr = [[0] * n for _ in range(n)]
Тут сначала был очень большой вопрос к логике, так как использование '_' вместо какой-то переменной было для меня в новинку.
Ну, так удобно обозначать переменную, имя которой нам в дальнейшем не понадобится.

Цитата Сообщение от IsenceonlyCPP Посмотреть сообщение
Python
1
2
3
4
if i+j == n-1 or i == j and i >= (n+1)//2 or i-j == 1 and i <= n//2:
    e *= m
j += int(e.real)
i += int(e.imag)
Эта часть кода мне вообще не поддаётся...
Ну, в этих точках матрицы вектор приращения e поворачивает против часовой стрелки (но по часовой относительно матрицы, так как у нас координата y отсчитывается сверху вниз). Как известно, умножение любого комплексного числа на число i (в питоне на 1j) поворачивает это число на 90 градусов против часовой стрелки, поэтому мы и умножаем в каждой такой точке вектор e на 1j.

Добавлено через 1 минуту
Цитата Сообщение от IsenceonlyCPP Посмотреть сообщение
к выводу без лишних пробелов
Здесь между элементами вместо пробела выводится табуляция.
Можно и так сделать:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def get_spiral(n):
    m = 1j
    e = cell_v = 1
    matr = [[0] * n for _ in range(n)]
    i = j = 0
    while True:
        matr[i][j] = cell_v
        if cell_v == n*n:
            return matr
        cell_v += 1
        if i+j == n-1 or i==j and i >= (n+1)//2 or i-j == 1 and i <= n//2:
            e *= m
        j += int(e.real)
        i += int(e.imag)
 
n = int(input('n = '))
matr = get_spiral(n)
for row in matr:
    print('\t'.join(map(str, row)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2024, 18:02
Помогаю со студенческими работами здесь

Реализация списков в компьютере
В существующем списке элементов добавить 3 элемента, в начало, середину и конец, после чего их удалить.

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

Реализация класса matrix для умножения матриц, заданных в виде списков
На вход подаются 2 произвольных списка (в тренировочном примере a=,] и b=,]). Класс matrix в своем конструкторе инициализирует матрицу...

Реализация двумерных списков
Написать программу, которая проверяет чек из магазина. На чеке указано, по каким ценам и в каком количестве куплены товары, а также...

Сортировка двумерных списков
Есть двумерный список List&lt;List&lt;string&gt;&gt; Photos = new List&lt;List&lt;string&gt;&gt;(); List&lt;string&gt; rowPhotos = new List&lt;string&gt;(); ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru