输入包含几种情况,每种情况的阶次为n的正方形,后接n行,每行的n个自然数在1到n²之间。 喜欢:
3
6 1 8
7 5 3
2 9 4
1
1
(...)
附加条件:
如果是魔方,则应打印(“是”),否则请打印(“ 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)
一些想法?
答案 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