我的Python书中有一个练习,它定义了一个函数,如果一个正方形是异方形,则该函数返回true。后面没有答案,但我开始研究它认为这是一个常见的问题,在这个网站上会有很多解决方案,但我找不到任何答案。
到目前为止,我已经粘贴了我的代码。我被检查对角线部分抛弃,我不知道该怎么做。有没有人可以帮我解决一个简单的初学者没有复杂的解决方案?
以下是问题定义: heterosquare是从1到n ^ 2的整数n×n数组,因此行,列和对角线具有不同的总和。
def isHeterosquare(square):
n = len(square)
sum = n * (n ** 2 + 1) // 2
if any(len(line) != n for line in square):
return False
if {num for line in square for num in line} != set(range(1, n ** 2 + 1)):
return False
# check if each element in the square sums the same for each row, column and diagonal:
[square[i][j] for i in range(n)] for j in range(n)]
return True
这是一个如何调用函数的示例,以便它返回true。
isHeterosquare([[1, 2, 3, 4],\
[5, 6, 7, 8],\
[9, 10, 11, 12],\
[13, 14, 16, 15]])
True
编辑:False的一个例子就是下面这个,因为你可以看到行总数为15,列总数为15,对角线从2,5,8总和为15.所以这一行将返回这是错误的,因为异方格在对角线,列和行上会有不同的总和。
isHeterosquare([[2,7,6],\
[9,5,1],\
[4,3,8]])
False
答案 0 :(得分:1)
这是我要做的:找到所有行,列和对角线的总和并存储在列表中。如果所有总和都是唯一的,那么列表的长度和该列表的集合长度将是相同的。看看这是否有帮助。
def get_sum_row(mat, row):
return sum(mat[row])
def get_sum_col(mat, col):
return sum(mat[i][col] for i in range(len(mat)))
def get_sum_dias(mat):
n = len(mat)
sum_dia1 = sum(mat[i][i] for i in range(n))
sum_dia2 = sum(mat[i][n-i-1] for i in range(n))
return [sum_dia1, sum_dia2]
def is_hetero_square(mat):
sum_l = list()
for i in range(len(mat)):
sum_l.append(get_sum_row(mat, i))
sum_l.append(get_sum_col(mat, i))
sum_l.extend(get_sum_dias(mat))
return len(sum_l) == len(set(sum_l))
mat1 = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,16,15]]
print(is_hetero_square(mat1)) # Prints True
mat2 = [[1,2,3],[4,5,6],[7,8,9]]
print(is_hetero_square(mat2)) # Prints False