Python:查找所有 6x6 矩阵,其中每个值在每列和每行中仅出现一次

Posted

技术标签:

【中文标题】Python:查找所有 6x6 矩阵,其中每个值在每列和每行中仅出现一次【英文标题】:Python: Finding all 6x6 matrices where each value occurs only once in each column and row 【发布时间】:2020-06-05 09:41:37 【问题描述】:

我想在 Python 中生成所有 6x6 矩阵,其中每个值(整数 1-6)在每列和每行中只出现一次(就像数独谜题,除了子网格)。我认为生成所有可能的 6x6 矩阵并在之后进行过滤不是一种选择,因为有 ~1.3*10^17 的可能性。

我发现在选择序列 1-6(总共 720 个)的排列时,矩阵的第 2 行将只有 265 种可能性,而第 3-4-5 行则更少。如果前 5 行已经被选中,第 6 行应该只有 1 种可能性。

我已经为 3x3 矩阵尝试了下面的代码并且它有效,但是我觉得添加更多具有更多比较的嵌套循环并不是解决此问题的最佳方法(如果有的话)。听起来它应该可以通过递归或列表理解来实现,但我无法确定它。

import itertools


input_list = []

for f in itertools.permutations([1,2,3],3):
  input_list.append(f)




for i in input_list:

  input_listcopy = input_list.copy()
  result = []
  result.append(i)
  input_listcopy.remove(i)

  for j in input_listcopy:
    if (i[0] != j[0] and i[1] != j[1] and i[2] != j[2]):
      result.append(j)



 print(result)

为了清楚起见,我期望的输出是一个二维列表,其中每个元素都是矩阵的一行,从顶部开始:

[[1,2,3],[2,3,1],[3,1,2]]

提前致谢!

【问题讨论】:

【参考方案1】:

这个怎么样?

from itertools import permutations

# Define the permutations
length = 6
elements = range(1, length+1)

result = []

for perm in permutations(elements, length):
  if not result:  #  The first permutation is added
    result.append(perm)
    continue 

  is_valid_list = []
  for row in result:
    is_valid = all(perm[idx] != row[idx] for idx in range(length))
    is_valid_list.append(is_valid)

  if all(is_valid_list):
    result.append(perm)

print(result)

【讨论】:

您的代码似乎只输出一种解决方案。当我以长度 3 运行它时,我希望至少有 2 个:[[1,3,2],[2,1,3],[3,2,1]][[1,2,3],[2,3,1],[3,1,2]]

以上是关于Python:查找所有 6x6 矩阵,其中每个值在每列和每行中仅出现一次的主要内容,如果未能解决你的问题,请参考以下文章

python编程,我建立一个2*2矩阵,然后想其中每个元素都乘上一个实数,于是我在矩阵后加上*2.

javascript 根据键值在数组中查找和删除对象

如何在 Python 中查找所有子模块?

NodeJS通过键的值在数组中查找对象[重复]

R - 给定一个矩阵和一个幂,生成多个矩阵,其中包含矩阵列的所有组合

python如何查找两个文本文件之间的所有单词匹配