Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/72: Рейтинг темы: голосов - 72, средняя оценка - 4.57
2 / 2 / 0
Регистрация: 28.01.2020
Сообщений: 12

Матрица по спирали

15.08.2021, 06:05. Показов 14810. Ответов 4

Студворк — интернет-сервис помощи студентам
Итак вопрос: Зачем проверка на диагональ и что за формула двойного значения в правом углу контура?Втф
Просто понять не могу

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
n = int(input())
 
# Создаем нулевую квадратную матрицу заданной размерности
a = [[0 for i in range(n)] for j in range(n)]
 
# Определяем внутренние счетчики для цикла
i = 0  # строки
j = 0  # столбцы
x = 1  # текущее значение для заполнения ячейки
k = 0  # порядковый номер контура
 
while x <= n * n:
    a[i][j] = x  # заполняем ячейку текущим значением
 
    if i != j:  # Только если мы сейчас не на диагонали!
        # Сумма зеркально расположенных элементов одинакова для текущего контура.
        # Она равна нижнему правому значению в контуре, умноженному на 2.
        # Так что на каждом шаге цикла мы заполняем зеркальный элемент матрицы,
        # просто вычитая текущее x из этой суммы ;)
        a[j][i] = (a[k][k] + (n - k * 2) * 2) * 2 - 4 - x
 
    if j != n - k - 1:
        # если еще не уперлись в правую границу контура, двигаемся вправо
        j += 1
 
    elif i != n - k - 1:
        # если еще не уперлись в нижнюю границу контура, двигаемся вниз
        i += 1
 
    elif x != n * n:
        # Если вправо и вниз уже нельзя, значит мы закончили обход текущего контура!
        # Только не забываем проверить, что x не равен n*n, а то будет бо-бо.
        k += 1  # переходим к следующему контуру
        i = j = k  # обход следующего контура начнем с координат [k,k]
        x = a[k][k - 1]  # текущее значение равно наибольшему в старом контуре
 
    x += 1  # Ну, и не забываем прибавлять единичку в конце цикла, какое бы условие ни сработало.
 
# Выводим на печать
for i in a: print(*i)
Добавлено через 48 секунд
Python
1
2
3
4
5
6
if i != j: # Только если мы сейчас не на диагонали!
# Сумма зеркально расположенных элементов одинакова для текущего контура.
# Она равна нижнему правому значению в контуре, умноженному на 2.
# Так что на каждом шаге цикла мы заполняем зеркальный элемент матрицы,
# просто вычитая текущее x из этой суммы 
a[j][i] = (a[k][k] + (n - k * 2) * 2) * 2 - 4 - x

Вообще не понимаю
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.08.2021, 06:05
Ответы с готовыми решениями:

Матрица, прочитанная по спирали с последовательностью
Кулити, начал проходить курсы по питону, остановился на массивах. Попалось невообразимое для меня задание. Дана последовательность,...

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

матрица по спирали
матрица 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

4
2 / 2 / 0
Регистрация: 28.01.2020
Сообщений: 12
15.08.2021, 06:11  [ТС]
Вот задача и пример вывода
Миниатюры
Матрица по спирали  
0
Эксперт Python
1356 / 653 / 207
Регистрация: 23.03.2014
Сообщений: 3,057
15.08.2021, 09:19
Averna, Вам нужна матрица змейкой?
Тогда вот
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
"""
Создаем матрицу-змейку
 
#n - размерность матрицы n x n
#b - результирующая матрица
#st - текущее значение-счетчик для записи в матрицу
#m - коеффициент, используемый для заполнения верхней
#матрицы последующих витков, т.к. одномерные матрицы
#следующих витков имеют меньше значений
"""
 
n = int(input("Размерность матрицы: "))
 
b = [[0] * n for i in range(n)]
st, m = 1, 0
# Заранее присваиваю значение центральному элементу
# матрицы
b[n // 2][n // 2] = n * n
for v in range(n // 2):
    # Заполнение верхней горизонтальной матрицы
    for i in range(n - m):
        b[v][i + v] = st
        st += 1
 
    # Заполнение правой вертикальной матрицы    
    for i in range(v + 1, n - v):
        b[i][-v - 1] = st
        st += 1
 
    # Заполнение нижней горизонтальной матрицы
    for i in range(v + 1, n - v):
        b[-v - 1][-i - 1] = st
        st += 1
 
    # Заполнение левой вертикальной матрицы
    for i in range(v + 1, n - (v + 1)):
        b[-i - 1][v] = st
        st += 1
 
    m += 2
 
b.reverse()
for el in b:
    el.reverse()
    print(el)
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
15.08.2021, 12:18
Как вариант
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n = int(input())
 
k = n*n 
b = [[k]]
 
for i in range(2*(n-1)):
    b = list(map(list,zip(*b[::-1])))
    
    for h in range(len(b)-1, -1, -1):
        k -= 1
        b[h].append(k)
 
b = list(map(list,zip(*b)))
 
for i in b[::-1]:
    print(*i)
2
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
15.08.2021, 12:47
Вариант, с комплексной арифметикой:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
n = int(input("Размерность матрицы: "))
table=[[0 for i in range(n)] for j in range(n)]
vec=-1 # стартовая точка
delta=1 # направление  заполнения
for k in range(1,n*n+1):
    vec=vec+delta
    j,i=int(vec.real), int(vec.imag)
    if not (0<=i<n and 0<=j<n and table[i][j]==0): # проверка не пустая ли ячейка
        vec-=delta
        delta*=1j #поворот направления заполнения
        vec+=delta
        j,i=int(vec.real), int(vec.imag)
    table[i][j]=k
for k in table:
    print(*k)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.08.2021, 12:47
Помогаю со студенческими работами здесь

матрица по спирали.
Сформировать квадратную матрицу порядка n (размерностью не меньше 3 и не больше 10) по заданному образцу. 1 2 3 4 5 16 17 18 19 6 ...

Матрица по спирали
сделайте пожалуйста программу чтобы матрица 7х7 закручивалась по спирати из 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Матрица по спирали
Написать программу, которая заполняет квадратную матрицу натуральными числами &quot;по спирали&quot;, используя глобальные переменные.

Матрица по спирали
Добрый день, помогите доделать программу, мучусь уже долго. Задача: Зашифровать текст следующим образом: записать его в матрицу по строкам,...

матрица по спирали
есть матрица с (0,0) элемента по спирали , а нужно середины for (int j = 0, m = a; j &lt;= m; j ++, m --){ for (int i =...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru