Python:检查一个正方形是否是异方形

时间:2018-04-18 03:25:07

标签: python python-3.x

我的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

1 个答案:

答案 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