如果矩阵形成一个魔术方而不导入numpy,则编写一个返回布尔值的函数true

时间:2016-11-09 17:43:07

标签: python python-3.x matrix magic-square

我已经编写了以下程序的一部分:

def matrix_is_square(matrix):
   for i in range(len(matrix)):
      if len(matrix[i]) != len(matrix):
         return False
   return True

如果矩阵是方阵,则此函数返回True,否则返回False。

但是,这时问题就开始了。

我必须编写第二个函数来确定函数是否为Magic square。

如果满足以下条件,则方阵形成幻方:

  1. 矩阵的元素是数字1,2,3,...,n 2
  2. 每行,每列和两个对角线中元素的总和是相同的值
  3. 代码首先以:

    开头
    def magic(matrix):
       if(not(is_square(matrix))): 
          return False
       # The remaining code
    

    这就是我的尝试。

     square = []
     for i in range(len(matrix)):
         square.append([])
         for j in range(len(matrix)):
             square[i].append(0)
    
     total = 0
     x = len(matrix)
     for i in range(x):
         total += square[i][i]
         if total != x*(x*x+1)/2:
              return False
         else:
            return True
    
     total = 0;
     for i in range(x):
         total += square[i][x-1-i]
         if total != x*(x*x+1)/2:
              return False
         else:
            return True
    

    我的代码中似乎有一些错误。一个重要的是我正在测试数字的确切相等性,这是错误的,因为数字不能完全表示为浮点数,但我找不到另一种方法来做到这一点。任何提示都将不胜感激。

    以下是此功能的预期结果,只是在同一页面上。

    • [[2,7, 6],[9,5,1],[4,3,8]]
    • [[16,3,2,13], [5,10,11,8],[9,6,7,12], [4,15,14,1]]

    • [[1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16]]
    • [[1,1],[1,1]]
    • [[1,1],[1,1],[1,2]]

    没有导入numpy。

1 个答案:

答案 0 :(得分:0)

使用//let button = UIButton() button.imageView?.backgroundColor = UIColor.red button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10) sumrange函数和any对象的复杂解决方案:

set

输出(顺序):

def magic(m):
    length = len(m)
    first_sum = set()
    if length <= 2 \
            or any(len(row) != length for row in m) \
            or any(i > (length * length) for row in m for i in row):
        return False

    for r in m:
        s = sum(r)
        if len(first_sum) == 0:
            first_sum.add(sum(r))
        if s not in first_sum:
            return False

    for i in range(length):
        s = sum([r[i] for r in m])
        if s not in first_sum:
            return False

    if sum(m[i][i] for i in range(length)) not in first_sum \
        or sum(m[i][i] for i in range(length - 1, -1, -1)) not in first_sum:
        return False

    return True

m = [[2,7,6],[9,5,1],[4,3,8]]
print(magic(m))

m = [[16,3,2,13], [5,10,11,8],[9,6,7,12], [4,15,14,1]]
print(magic(m))

m = [[1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16]]
print(magic(m))

m = [[1,1],[1,1]]
print(magic(m))

m = [[1,1],[1,1],[1,2]]
print(magic(m))