Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

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

#python #массивы #матрицы


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

Мой код:

import random
p=0
n=int(input('Введите четное число: '))
matrix=[[random.randrange(10) for i in range(n)] for j in range(n)]
for elem in matrix:
    print(elem)
for k in range(n):    #Проверяю равны ли суммы всех элементов строк между собой
    for l in range(k+1,n):
         if sum(matrix[k])==sum(matrix[l]):
            p+=1    #если предыдущая строка равна по сумме элементов следущей, то
переменную p увеличиваю на единицу, чтобы потом если p==n (если p равняется кол-ву
строк, то потом проверять на сумму элементов по столбцам матрицы)


Но как проверить равны ли суммы элементов столбцов матрицы? Подскажите пожалуйста.
    


Ответы

Ответ 1



Нет нужды сравнивать все строки со всеми, чтобы выяснить, что все суммы равны. Достаточно найти первую сумму и сравнивать остальные с ней. first = sum(matrix[0]) for k in range(1, n): if sum(matrix[0]) != first: return False Для столбцов - просто посчитать их суммы и так же сравнить с эталоном for k in range(0, n): if sum([row[k] for row in matrix]) != first: return False

Ответ 2



Я бы, наверное, сделал так: import numpy as np def ismagic(a): if np.array_equal(np.unique(a.sum(axis=1)),np.unique(a.sum(axis=0))): return True else: return False Проверяем: a = np.matrix([[1, 2], [4, 3]]) print(ismagic(a)) b = np.ones((5,5)) print(ismagic(b)) c = np.matrix([[2,7,6],[9,5,1],[4,3,8]]) print(ismagic(c)) d = np.matrix([[17,24,1,8,15],[23,5,7,14,16],[4,6,13,20,22],[10,12,19,21,3],[11,18,25,2,9]]) print(ismagic(d)) На выходе: False True True True

Ответ 3



Решение с использованием модуля Numpy для проверки на настоящий магический квадрат (с проверкой сумм главной и побочной диагоналей): import numpy as np a = np.array([[2,7,6],[9,5,1],[4,3,8]]) In [90]: a Out[90]: array([[2, 7, 6], [9, 5, 1], [4, 3, 8]]) In [91]: a.sum(axis=0) Out[91]: array([15, 15, 15]) In [92]: a.sum(axis=1) Out[92]: array([15, 15, 15]) In [93]: np.diag(a).sum() Out[93]: 15 In [94]: np.diag(np.flipr(a)).sum() Out[94]: 15 решение: In [98]: s = np.diag(a).sum() In [99]: (s == np.diag(np.flipr(a)).sum()) and (a.sum(axis=0) == s).all() and (a.sum(axis=1) == s).all() Out[99]: True

Ответ 4



In [12]: import numpy as np In [13]: matrix = [ ...: [1, 2, 3, 4, 5], ...: [8, 9, 5, 4, 5], ...: [0, 1, 2, 3, 5], ...: [7, 8, 9, 4, 2] ...: ] In [14]: main_sum = sum(matrix[0]) * 2 In [15]: def foo(matrix): ...: tran = np.array(matrix).T ...: for i, j in zip(matrix, tran): ...: if sum(i) + sum(j) != main_sum: ...: return False ...: return True ...: ...: In [16]: foo(matrix) Out[16]: False In [17]: matrix = [[2, 7, 6], [9, 5, 1], [4, 3, 8]] # magic In [18]: foo(matrix) Out[18]: True Работает на матрицах где кол-во строк равно кол-ву столбцов.

Комментариев нет:

Отправить комментарий