检查它是否是python的魔方

时间:2018-11-06 15:37:17

标签: python

输入包含几种情况,每种情况的阶次为n的正方形,后接n行,每行的n个自然数在1到n²之间。 喜欢:

3
6 1 8
7 5 3
2 9 4

1
1
(...)

附加条件:

  • 1到n²之间的所有数字出现一次
  • 所有行,列和两个主要对角线的总和必须相同。

如果是魔方,则应打印(“是”),否则请打印(“ no”)

所以我的代码可以解决所有正确的输入,但那些重复输入的数字除外,我不知道如何解决该问题

我的代码

a = read(int)
while a is not None:
    check1 = True
    t = 0 
    s = 0
    listaA = [] 
    ## create matrix of lists like A([b[],b[],b[]])
    for j in range(a):
        b = []
        for k in range(a):
            c = read(int)
            if c in listaB:
                (a-1) - k
            listaB.append(c)
            b.append(c)
        listaA.append(b)
    if a == 1:
        check1 = False
        print("yes")
    else:
        x = sum(listaA[0])
    i=0
    while i<a and check1 == True:
    #for i in range(a):
        # suma la primera fila 
        suma=sum(listaA[i])
        if x != suma:
            print('no')
            break
        ## check columns 
        y = 0
        for j in range(a):
            y += listaA[j][i]
        if y != x:
            print('no')
            break
        i+=1
    ## check diagonals
    if i==a: 
        for i in range(a):
            t += (listaA[i][i])
            s += listaA[i][(a-1)-i]
        if s != x or t != x:
            print('no')

        else:
            print('yes')
    a = read(int)

一些想法?

1 个答案:

答案 0 :(得分:1)

您可以使用集合比较来检查1到n²之间的所有数字是否都出现一次,并使用sum和这样的生成器表达式来测试所有行,列和两个主要对角线的总和是否相同:

def is_magic(m):
    n = len(m)
    s = (n ** 2 + 1) * n // 2
    return (
        set(range(1, n ** 2 + 1)) == set(i for r in m for i in r) and
        all(sum(r) == s for r in (*m, *zip(*m))) and
        sum(m[i][i] for i in range(n)) == sum(m[i][-i - 1] for i in range(n)) == s
    )

这样:

is_magic(
    [
        [6, 1, 8],
        [7, 5, 3],
        [2, 9, 4]
    ]
)

返回:

True