Мы определяем магический квадрат как матрицу различных положительных целых чисел, от которой сумма любой строки, столбца или диагонали длины всегда равна одному и тому же числу: магической константе.
Вам будет предоставлена матрица целых чисел в инклюзивном диапазоне. Мы можем преобразовать любую цифру в любую другую цифру в диапазоне по цене. Учитывая, преобразовать его в магический квадрат с минимальными затратами. Выведите эту стоимость с новой строки.
Примечание. Результирующий магический квадрат должен содержать различные целые числа из включенного диапазона.
Например, мы начинаем со следующей матрицы:
5 3 4
1 5 8
6 4 2
Мы можем преобразовать его в следующий магический квадрат:
8 3 4
1 5 9
6 7 2
Для этого потребовалось три замены стоимостью. 5-8 + 8-9 + 4-7 = 7
Мне нужно написать программу для этого, но я получаю неверный результат, когда пытаюсь ее запустить.
def formingMagicSquare(s):
arr=[]
duplicates=[]
totaldifference=0
for i in range(0,len(s)):
linesum=sum(s[i])
for j in range(0,len(s[i])):
if (s[i][j] in arr and linesum!=15):
duplicates.append(i*10+j)
else:
arr.append(s[i][j])
for i in range(0,len(duplicates)):
iarr = duplicates[i]//10
jarr = duplicates[i]%10
linesum=sum(s[i])
difference=15-linesum
totaldifference = totaldifference + difference
return totaldifference
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
s = []
for _ in range(3):
s.append(list(map(int, input().rstrip().split())))
result = formingMagicSquare(s)
fptr.write(str(result) + '\n')
fptr.close()
Есть ли отладчик для Python, который может отлаживать строку за строкой, например, Visual Studio?
Да, например jetbrains.com/pycharm
@GhasemBanazadeh Ну, Код Visual Studio делает это очень похоже на Visual Studio;)
Какой алгоритм используется? возврат?






class Magic(object):
pre = [
[[8, 1, 6], [3, 5, 7], [4, 9, 2]],
[[6, 1, 8], [7, 5, 3], [2, 9, 4]],
[[4, 9, 2], [3, 5, 7], [8, 1, 6]],
[[2, 9, 4], [7, 5, 3], [6, 1, 8]],
[[8, 3, 4], [1, 5, 9], [6, 7, 2]],
[[4, 3, 8], [9, 5, 1], [2, 7, 6]],
[[6, 7, 2], [1, 5, 9], [8, 3, 4]],
[[2, 7, 6], [9, 5, 1], [4, 3, 8]],
]
def evaluate(self, s):
totals = []
for p in self.pre:
total = 0
for p_row, s_row in zip(p, s):
for i, j in zip(p_row, s_row):
if not i == j:
total += max([i, j]) - min([i, j])
totals.append(total)
return min(totals)
def main():
s=[]
for _ in range(3):
s.append(list(map(int, input().rstrip().split())))
magic = Magic()
result = magic.evaluate(s)
print(result)
if __name__ == '__main__':
main()
Спасибо, я написал новый код и изменил свой код с базового.
Думаю, вы легко можете попробовать:
def forming_magic_square(s):
# Flaten s
s = list(itertools.chain.from_iterable(s))
magic_squares = [
[8, 1, 6, 3, 5, 7, 4, 9, 2],
[6, 1, 8, 7, 5, 3, 2, 9, 4],
[4, 9, 2, 3, 5, 7, 8, 1, 6],
[2, 9, 4, 7, 5, 3, 6, 1, 8],
[8, 3, 4, 1, 5, 9, 6, 7, 2],
[4, 3, 8, 9, 5, 1, 2, 7, 6],
[6, 7, 2, 1, 5, 9, 8, 3, 4],
[2, 7, 6, 9, 5, 1, 4, 3, 8],
]
costs = []
for magic_square in magic_squares:
costs.append(sum([abs(magic_square[i] - s[i]) for i in range(9)]))
return min(costs)
Теперь вы должны использовать отладчик, чтобы построчно и посмотреть, какой из них сделал то, чего вы не ожидали.