用 Python 编写程序检查是否可以填充正方形,其中每行和每列将容纳不同的元素

pythonserver side programmingprogramming更新于 2026/1/18 1:48:17

假设我们有一个 n × n 矩阵,其中包含从 0 到 n 的值。这里 0 表示未填充的正方形,我们必须检查是否可以填充空正方形,使得每行和每列中的每个数字从 1 到 n 都恰好出现一次。

因此,如果输入如下

002
201
123

那么输出将为 True,因为我们可以将矩阵设置为

312
231
123

为了解决这个问题,我们将遵循以下步骤 −

  • 定义一个函数 find_empty_cell() 。这将采用矩阵 n

  • 对于范围从 0 到 n 的 i,执行

    • 对于范围从 0 到 n 的 j,执行

      • 如果 matrix[i, j] 与 0 相同,则

        • return(i, j)

  • return(-1, -1)

  • 定义一个函数 is_feasible() 。这将采用矩阵 i、j、x

  • 如果 x 在矩阵的第 i 行,则

    • 返回 False

  • 如果 x 在矩阵任意行的第 j 列,则

    • 返回 False


  • 返回 True

  • 定义一个函数 is_complete() 。这将获取矩阵 n

  • 对于矩阵中的每一行,执行

    • 如果行有一些重复元素,则

      • 返回 False

    • 对于范围从 0 到 n 的 col,执行

      • 如果 col 有一些重复元素,则

        • 返回 False

    • 返回 True

    • 从主方法执行以下操作 −

    • n := 矩阵的行数

    • (i, j) = find_empty_cell(matrix, n)

    • 如果 (i, j) 与 (-1, -1) 相同,则

      • 如果 is_complete(matrix, n) 为真,则

        • 返回 True

      • 否则,

        • 返回 False

    • 对于 1 到 n + 1 范围内的 x,执行

      • 如果 is_feasible(matrix, i, j, x) 为真,则

        • matrix[i, j] := x

        • 如果解决(矩阵)为真,则

          • 返回 True

        • matrix[i, j] := 0

    • 返回 False


让我们看看下面的实现以便更好地理解 −

示例

class Solution:
   def solve(self, matrix):
      n = len(matrix)
      def find_empty_cell(matrix, n):
         for i in range(n):
            for j in range(n):
               if matrix[i][j] == 0:
                  return (i, j)
         return (-1, -1)
      def is_feasible(matrix, i, j, x):
         if x in matrix[i]:
            return False
         if x in [row[j] for row in matrix]:
            return False
         return True
      def is_complete(matrix, n):
         for row in matrix:
            if set(row) != set(range(1, n + 1)):
               return False
         for col in range(n):
            if set(row[col] for row in matrix) != set(range(1, n + 1)):
               return False
         return True
      (i, j) = find_empty_cell(matrix, n)

      if (i, j) == (-1, -1):
         if is_complete(matrix, n):
            return True
         else:
            return False
      for x in range(1, n + 1):
         if is_feasible(matrix, i, j, x):
            matrix[i][j] = x
            if self.solve(matrix):
               return True
            matrix[i][j] = 0
      return False
ob = Solution()
matrix = [
   [0, 0, 2],
   [2, 0, 1],
   [1, 2, 3]
]
print(ob.solve(matrix))

输入

matrix = [
   [0, 0, 2],
   [2, 0, 1],
   [1, 2, 3] ]

输出

True

相关文章


有用资源