【问题标题】:Forming a magic square形成一个魔方
【发布时间】:2020-10-19 05:53:40
【问题描述】:

我们将幻方定义为一个由不同的正整数组成的矩阵,其中任何行、列或对角线长度的总和始终等于同一个数字:幻常数。

您将获得一个包含范围内的整数矩阵。我们可以将任何数字转换为范围内的任何其他数字,成本为 。给定 ,以最低成本将其转换为幻方。在新行上打印此费用。

注意:生成的幻方必须包含包含范围内的不同整数。

例如,我们从以下矩阵开始:

5 3 4

1 5 8

6 4 2

我们可以把它转换成下面的幻方:

8 3 4

1 5 9

6 7 2

这需要 3 次替换,成本为 . 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 Code 做起来很像 Visual Studio ;)
  • 使用的算法是什么?回溯?

标签: python magic-square


【解决方案1】:
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()

谢谢你,我写了一个新代码,我已经从基础更改了我的代码。

【讨论】:

    【解决方案2】:

    我认为您可以轻松尝试:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多