Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/55: Рейтинг темы: голосов - 55, средняя оценка - 4.84
3 / 3 / 0
Регистрация: 25.04.2020
Сообщений: 131

Магический квадрат

01.01.2021, 15:30. Показов 12248. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Определить является ли массив размерности n × n логическим магическим квадратом, то есть суммы по всем горизонталям, вертикалям и двум диагоналям должны быть равны. Использовать нужно двухмерный массив
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.01.2021, 15:30
Ответы с готовыми решениями:

Магический шар 8
Магический шар 8 - шуточный способ предсказывать будущее. Программа должна просить пользователя задать некий вопрос, чтобы случайным...

Магический матод __add__
Всем привет. Не могу разобраться с данной задачей. Вот она: "Для одной игры необходимо реализовать механику магии, где при соединении...

Класс MagicalGift (Магический дар)
Напишите класс MagicalGift (Магический дар). Экземпляр класса при инициализации принимает аргументы: имя мага; произвольное число...

21
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
01.01.2021, 15:37
Цитата Сообщение от 1LEX Посмотреть сообщение
массив размерности n × n
Цитата Сообщение от 1LEX Посмотреть сообщение
Использовать нужно двухмерный массив
Логично

1LEX, в чем трудности возникли?
0
31 / 18 / 5
Регистрация: 30.08.2020
Сообщений: 55
05.01.2021, 17:47
Лучший ответ Сообщение было отмечено 1LEX как решение

Решение

1LEX, на Python
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
a = [[int(j) for j in input().split()] for i in range(int(input('Размер массива: ')))]
checking_sum = sum(a[0])
magic_square = True
for row in a:
    if sum(row) != checking_sum:
        magic_square = False
        break
if magic_square:
    for row_number in range(len(a)):
        summ = 0
        for column_number in range(len(a[row_number])):
            summ += a[row_number][column_number]
        if summ != checking_sum:
            magic_square = False
            break
if magic_square:
    summ = 0
    for i in range(len(a)):
        summ += a[i][i]
    if summ == checking_sum:
        summ = 0
        for i, j in zip([i for i in range(len(a) - 1, -1, -1)], [i for i in range(len(a))]):
            summ += a[j][i]
        if summ != checking_sum:
            magic_square = False
print('Является.') if magic_square else print('Не является.')
Добавлено через 22 минуты
Цитата Сообщение от pchela_sociofob Посмотреть сообщение
if summ == checking_sum:
Python
1
2
3
    if summ != checking_sum:
        magic_square = False
if magic_square:
1
3 / 3 / 0
Регистрация: 25.04.2020
Сообщений: 131
05.01.2021, 18:24  [ТС]
pchela_sociofob, спасибо вам, а можно как-то вывести матрицу? и например чтобы числа генерировались рандомно, а не вводить их
0
31 / 18 / 5
Регистрация: 30.08.2020
Сообщений: 55
05.01.2021, 19:52
1LEX, Вывести матрицу:
Python
1
2
for row in a:
    print(*row)
Для рандомной генерации чисел меняете первую строку на:
Python
1
2
3
import random
n = random.randint(0, 10) # любой другой диапазон по желанию
a = [[random.randint(0, 10) for j in range(n)] for i in range(n)]
1
3 / 3 / 0
Регистрация: 25.04.2020
Сообщений: 131
05.01.2021, 20:14  [ТС]
pchela_sociofob, спасибо вам огромное!!!!
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
06.01.2021, 21:30
Цитата Сообщение от pchela_sociofob Посмотреть сообщение
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
a = [[int(j) for j in input().split()] for i in range(int(input('Размер массива: ')))]
checking_sum = sum(a[0])
magic_square = True
for row in a:
    if sum(row) != checking_sum:
        magic_square = False
        break
if magic_square:
    for row_number in range(len(a)):
        summ = 0
        for column_number in range(len(a[row_number])):
            summ += a[row_number][column_number]
        if summ != checking_sum:
            magic_square = False
            break
if magic_square:
    summ = 0
    for i in range(len(a)):
        summ += a[i][i]
    if summ == checking_sum:
        summ = 0
        for i, j in zip([i for i in range(len(a) - 1, -1, -1)], [i for i in range(len(a))]):
            summ += a[j][i]
        if summ != checking_sum:
            magic_square = False
print('Является.') if magic_square else print('Не является.')
Добавлено через 22 минуты
Сообщение от pchela_sociofob
if summ == checking_sum:
Python
1
2
3
if summ != checking_sum:
        magic_square = False
if magic_square:
Цитата Сообщение от pchela_sociofob Посмотреть сообщение
Вывести матрицу:

Python
1
2
for row in a:
    print(*row)
Цитата Сообщение от pchela_sociofob Посмотреть сообщение
Для рандомной генерации чисел меняете первую строку на:
Python
1
2
3
import random
n = random.randint(0, 10) # любой другой диапазон по желанию
a = [[random.randint(0, 10) for j in range(n)] for i in range(n)]



Почему то всегда выдает: "Не является." какие же тогда вводить значения, чтобы получить магический квадрат????

Добавлено через 2 минуты
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
import random
n = random.randint(0, 50) 
a = [[random.randint(0, 50) for j in range(n)] for i in range(n)]
checking_sum = sum(a[0])
magic_square = True
for row in a:
    if sum(row) != checking_sum:
        magic_square = False
        break
if magic_square:
    for row_number in range(len(a)):
        summ = 0
        for column_number in range(len(a[row_number])):
            summ += a[row_number][column_number]
        if summ != checking_sum:
            magic_square = False
            break
if magic_square:
    summ = 0
    for i in range(len(a)):
        summ += a[i][i]
    if summ == checking_sum:
        summ = 0
        for i, j in zip([i for i in range(len(a) - 1, -1, -1)], [i for i in range(len(a))]):
            summ += a[j][i]
        if summ != checking_sum:
            magic_square = False
print('Является.') if magic_square else print('Не является.'
0
31 / 18 / 5
Регистрация: 30.08.2020
Сообщений: 55
06.01.2021, 22:03
isaak, если числа генерируются рандомно, то практически бесконечно может генерироваться такая матрица, где числа не образуют магический квадрат.
Кликните здесь для просмотра всего текста
Предлагаю изучить модуль random в Python, чтобы сделать вероятность выпадения ответов более-менее одинаковой.
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
06.01.2021, 22:35
isaak, в инете нашел. Переделал чуток - теперь 50/50 выдает магический/немагический квадраты
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
from random import randint
def magic(n) :
    A = [[0] * n for i in range(n)]
    for i in range(n):
        A[i][i]=(n-1)/2
        for k in range(n):
            if k<(n-1)/2:
                if i+k+1<n:
                    A[i][i+k+1]=k
                else:
                    A[i][i+k+1-n]=k
            else:
                if k==(n-1)/2:
                    pass
                else:
                    if k+i<n:
                        A[i][i+k]=k
                    else:
                        A[i][i+k-n]=k
    m = randint(1,10)
    rr = randint(0,1)
    print(rr)
    B = [[0] * n for i in range(n)]
    for i in range(n):   
        for k in range(n):
            B[i][k] = int(A[i][k]*n+A[i][n-1-k]) + m + rr*randint(0,10)
    return (B)
 
n = int(input())
arr = magic(n)
for i in arr :
    print(*i)
Если, конечно, еще нужно...
1
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
06.01.2021, 22:41
Пробовал разные значения 10, 20, 30 , 40 и 50 и все время пишет, что не является: "Не является."
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
06.01.2021, 23:15
pchela_sociofob, ваш код на четвертой попытке выдает ошибку выхода из диапазона:
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
import random
n = random.randint(0, 10) 
a = [[random.randint(0, 10) for j in range(n)] for i in range(n)]
checking_sum = sum(a[0])
magic_square = True
for row in a:
    if sum(row) != checking_sum:
        magic_square = False
        break
if magic_square:
    for row_number in range(len(a)):
        summ = 0
        for column_number in range(len(a[row_number])):
            summ += a[row_number][column_number]
        if summ != checking_sum:
            magic_square = False
            break
if magic_square:
    summ = 0
    for i in range(len(a)):
        summ += a[i][i]
    if summ == checking_sum:
        summ = 0
        for i, j in zip([i for i in range(len(a) - 1, -1, -1)], [i for i in range(len(a))]):
            summ += a[j][i]
        if summ != checking_sum:
            magic_square = False
print('Является.') if magic_square else print('Не является.')
for row in a:
    print(*row)
Миниатюры
Магический квадрат  
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
06.01.2021, 23:27
Gdez, ваш код более корректно работает:
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
from random import randint
def magic(n) :
    A = [[0] * n for i in range(n)]
    for i in range(n):
        A[i][i]=(n-1)/2
        for k in range(n):
            if k<(n-1)/2:
                if i+k+1<n:
                    A[i][i+k+1]=k
                else:
                    A[i][i+k+1-n]=k
            else:
                if k==(n-1)/2:
                    pass
                else:
                    if k+i<n:
                        A[i][i+k]=k
                    else:
                        A[i][i+k-n]=k
    m = randint(1,10)
    rr = randint(0,1)
    print(rr)
    B = [[0] * n for i in range(n)]
    for i in range(n):   
        for k in range(n):
            B[i][k] = int(A[i][k]*n+A[i][n-1-k]) + m + rr*randint(0,10)
    return (B)
 
n = int(input())
arr = magic(n)
for i in arr :
    print(*i)
    print('Является.') if magic(n) else print('Не является.')
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
06.01.2021, 23:51
isaak,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def check_magic(arr) :
    k = sum((arr[i][i] for i in range(len(arr))))
    ch = all([sum(i) == k for i in arr])
    arr1 = list(zip(*arr))
    k1 = sum((arr1[i][i] for i in range(len(arr1))))
    ch1 = all([sum(i) == k1 for i in arr1])
    return k == k1 and ch and ch1
    
f = [[21, 10, 13, 22, 29],
[30, 18, 7, 14, 26],
[23, 27, 19, 11, 15],
[12, 24, 31, 20, 8],
[9, 16, 25, 28, 17]]
 
print(check_magic(f))
 
fn = [[211, 10, 13, 22, 29],
[30, 18, 7, 14, 26],
[23, 27, 19, 11, 15],
[12, 24, 31, 20, 8],
[9, 16, 25, 28, 17]]
 
print(check_magic(fn))
Добавлено через 2 минуты
Тот код был - генерация магического квадрата n*n
А проверка - этот крайний
1
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
07.01.2021, 12:28
Gdez, огромное спасибо за ответ. Остался еще один вопрос как сделать. Как сделать, чтобы числа генерировались рандомно одновременно с проверкой на магический или не магический квадрат? заранее огромное спасибо.
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
07.01.2021, 13:45
Подскажите пожалуйста как убрать ошибки в коде:
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
import random
n = random.randint(0, 10) 
a = [[random.randint(0, 10) for j in range(n)] for i in range(n)]
checking_sum = sum(a[0])
magic_square = True
for row in a:
    if sum(row) != checking_sum:
        magic_square = False
        break
if magic_square:
    for row_number in range(len(a)):
        summ = 0
        for column_number in range(len(a[row_number])):
            summ += a[row_number][column_number]
        if summ != checking_sum:
            magic_square = False
            break
if magic_square:
    summ = 0
    for i in range(len(a)):
        summ += a[i][i]
    if summ == checking_sum:
        summ = 0
        for i, j in zip([i for i in range(len(a) - 1, -1, -1)], [i for i in range(len(a))]):
            summ += a[j][i]
        if summ != checking_sum:
            magic_square = False
print('Является.') if magic_square else print('Не является.')
for row in a:
    print(*row)
На 5 и 6 тесте программы выскакивают???? Заранее огромное спасибо.
Миниатюры
Магический квадрат   Магический квадрат  
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
07.01.2021, 15:50
isaak, вместо
Python
1
n = random.randint(0, 10)
Нужно
Python
1
n = random.randint(1, 10)
1
0 / 0 / 0
Регистрация: 27.01.2024
Сообщений: 1
27.01.2024, 00:23
Уже много ответов, но может кому-то такая запись будет удобнее и понятней
# эта программа проверяет является ли список магическим квадратом Ло Шу
#сейчас стоит магический квадрат 3*3 и программа пишет что он магический
# можно заменить matrix= [[random.randint(0, n**2) for j in range(n)] for i in range(n)]
# тогда он будет на рандом создавать квадраты, но магический выпадает редко

import random
def magic() :
____ # количество столбцов и строк в квадрате
_____ n = int(input('Введите размеры квадрата например если Вы хотите 3*3, введите 3: ')
____ #создаем матрицу см выше если хотите чтоб программа создавала на рандом
_____ matrix=[[4, 9, 2],
__________ [3, 5, 7],
__________ [8, 1, 6]]
_____ print(matrix) # печатает матрицу/список, необязательно, но удобно если создаете на рандом
______d1=d2=0 #счетчик суммы диагонали
_____ for i in range(n): # цикл для столбца
___________ stolb_sum=stroka_sum=0 #счетчик сум столбцов и диагоналей
____________ for j in range(n): # цикл для строк
_________________ stolb_sum+=matrix[j][i]
_________________ stroka_sum+=matrix[i][j]
____________ d1+=matrix[i][i]
____________ d2+=matrix[i][n-i-1]
______if stolb_sum==stroka_sum==d1==d2:
_________ print('МАГИЯ')
______else:
_______________ print(' квадрат немагический')

magic()
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
27.01.2024, 09:48
weinsoir, с места и сразу в карьер?
Цитата Сообщение от weinsoir Посмотреть сообщение
может кому-то такая запись будет удобнее и понятней
Почитайте сначала это, научитесь оформлять сообщения, а уже потом занимайтесь "некропостингом"
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
27.01.2024, 10:59
Ну или так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
from random import randint
from itertools import chain
 
def is_magic(matr):
    n = len(matr)
    mm = list(chain(*matr))
    return len(set(list(map(sum, matr + list(zip(*matr)))) + [sum(mm[::n+1]), sum(mm[n-1:n*(n-1)+1:n-1])])) == 1
 
n = randint(2,4)
while not is_magic( matr := [[randint(1,3) for _ in range(n)] for _ in range(n)] ):
    pass
print(*matr, sep='\n')
1
78 / 73 / 19
Регистрация: 18.05.2021
Сообщений: 287
27.01.2024, 12:44
Лучший ответ Сообщение было отмечено DobroAlex как решение

Решение

Показалось несколько более понятной записью
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
A = []
n = int(input("Введите размерность: "))
for i in range(n):
    A.append(list(map(int, input("Введите значения в строке через пробел: ").split())))
 
sums = [0]*(n*2+2)
for i in range(n):
    for j in range(n):
        sums[i] += A[i][j]
        sums[n+i] += A[j][i]
        if i==j:
            sums[2*n] += A[i][j]
        if i==(n-j-1):
            sums[2*n+1] += A[i][j]
 
if len(set(sums)) == 1:
    print("Магический")
else:
    print("Немагический")
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.01.2024, 12:44
Помогаю со студенческими работами здесь

Магический квадрат
Python.Магическим квадратом называют таблицу, в которой записаны числа 1,2,3,… по одному разу, так что сумма чисел в каждой строке и в...

Магический квадрат
Пытаюсь сделать матрицу, которая будет формировать магический квадрат. Почему питон ругается на плюсы в 20,22,30 и 32 строке? Как исправить...

Магический квадрат
Магический квадрат Магическим квадратом называют таблицу, в которой записаны числа 1,2,3,… по одному разу, так что сумма чисел в каждой...

Построить магический квадрат заданного порядка
Магическим квадратом порядка N называется квадратная матрица размера N × N , составленная из чисел 1, 2, ..., N 2 так, что суммы по каждому...

Магический метод класса на C
Доброго времени суток. Есть класс: class MyClass: def __call__(self, X): # вычисления с полями класса и входным...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru