Во-первых, обратите внимание, что сумма каждой строки / столбца обязательно должна быть 15, потому что сумма трех строк вместе должна быть равна сумме чисел от 1 до 9, то есть 45.
Вот способ создания всех 72 решений с использованием Z3 , решения с открытым исходным кодом SAT / SMT . Обратите внимание, что Z3 является мощным решением для такого рода комбинаторных задач и, вероятно, немного излишним для этой конкретной c. Но это может быть использовано в качестве примера того, как такие комбинаторные проблемы могут быть решены, также гораздо более хитрые. См., Например, этот длинный список примеров.
from z3 import *
# get 9 integer variables for the matrix elements
M = [[Int(f"m{i}{j}") for j in range(3)] for i in range(3)]
# create a Z3 solver instance
s = Solver()
# all numbers must be between 1 and 9
s.add([And(M[i][j] >= 1, M[i][j] <= 9) for i in range(3) for j in range(3)])
# all the rows must sum to 15
s.add([And([Sum([M[i][j] for j in range(3)]) == 15]) for i in range(3)])
# all the columns must sum to 15
s.add([And([Sum([M[i][j] for i in range(3)]) == 15]) for j in range(3)])
# all 9 numbers must be distinct
s.add(Distinct([M[i][j] for i in range(3) for j in range(3)]))
res = s.check()
num_solutions = 0
while res == sat:
num_solutions += 1
m = s.model()
print(num_solutions, ":", [[m[M[i][j]] for j in range(3)] for i in range(3)])
# add a new condition that at least one of the elements must be different to the current solution
s.add(Or([m[M[i][j]].as_long() != M[i][j] for i in range(3) for j in range(3)]))
res = s.check()
Вывод:
1 : [[3, 4, 8], [5, 9, 1], [7, 2, 6]]
2 : [[5, 7, 3], [9, 2, 4], [1, 6, 8]]
3 : [[6, 8, 1], [7, 3, 5], [2, 4, 9]]
...
72 : [[7, 5, 3], [6, 1, 8], [2, 9, 4]]
Все решения эквивалентны друг другу. Вы можете переставлять строки и / или столбцы решения, чтобы получить другое. И вы можете отразить решение проблемы. 3! ряд перестановок раз 3! время перестановки столбцов 2 для зеркалирования, всего 72.