Формирование магического квадрата

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

Вам будет предоставлена ​​матрица целых чисел в инклюзивном диапазоне. Мы можем преобразовать любую цифру в любую другую цифру в диапазоне по цене. Учитывая, преобразовать его в магический квадрат с минимальными затратами. Выведите эту стоимость с новой строки.

Примечание. Результирующий магический квадрат должен содержать различные целые числа из включенного диапазона.

Например, мы начинаем со следующей матрицы:

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()

Теперь вы должны использовать отладчик, чтобы построчно и посмотреть, какой из них сделал то, чего вы не ожидали.

zvone 18.08.2018 19:50

Есть ли отладчик для Python, который может отлаживать строку за строкой, например, Visual Studio?

Ghasem Banazadeh 18.08.2018 20:03

Да, например jetbrains.com/pycharm

Adrian W 18.08.2018 21:52

@GhasemBanazadeh Ну, Код Visual Studio делает это очень похоже на Visual Studio;)

zvone 18.08.2018 21:57

Какой алгоритм используется? возврат?

Sai Kumar 29.07.2020 11:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
1 913
2

Ответы 2

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)

Другие вопросы по теме