5*12网格中所有唯一组合的算法



我正在寻找一个算法或问题的名称(我认为这是非常旧的,没有什么新的(。我想在5x12网格中找到5个填充单元格的所有独特组合。

示例:

1|0|0|0|0|0|0|0|0|0|0|0
-----------------------
1|0|0|0|0|0|0|0|0|0|0|0
-----------------------
1|0|0|0|0|0|0|0|0|0|0|0
-----------------------
1|0|0|0|0|0|0|0|0|0|0|0
-----------------------
1|0|0|0|0|0|0|0|0|0|0|0

1|0|0|0|0|0|0|0|0|0|0|0
-----------------------
1|0|0|0|0|0|0|0|0|0|0|0
-----------------------
1|0|0|0|0|0|0|0|0|0|0|0
-----------------------
1|0|0|0|0|0|0|0|0|0|0|0
-----------------------
0|0|1|0|0|0|0|0|0|0|0|0

1|1|1|1|1|0|0|0|0|0|0|0
-----------------------
0|0|0|0|0|0|0|0|0|0|0|0
-----------------------
0|0|0|0|0|0|0|0|0|0|0|0
-----------------------
0|0|0|0|0|0|0|0|0|0|0|0
-----------------------
0|0|0|0|0|0|0|0|0|0|0|0
this is also valid 

每个被占用的小区将被表示为(X,Y(-元组

唯一组合数量的相应公式是n over k-binomialcefficient(或类似的公式(,如果我回忆正确的话,这大约是510万个唯一组合。

这里或其他平台上的大多数其他类似问题都以某种方式限制了它,即每行必须恰好占用一个单元格。对于我的特殊情况,这不是真的,也是我问题的原因。

这是我在这里的第一个问题,我希望有人能帮助我解决这个问题,因为我找不到系统方法的想法

我建议您使用这个简单易懂的解决方案:首先,给每个单元格一个索引,这样我们就可以讨论60个单元格的长度列表,而不是一个2个刻度板。我想让你在这样一个索引列表的开头:[1,2,3…59,60]现在,您基本上需要这些索引的每个k大小(在您的情况下是五个(组合。剩下的很容易。使用此代码:

def findsubsets(s, n): 
return list(itertools.combinations(s, n)) 

而s是你的列表,n是k(对你来说是5(。此函数返回列表中5个数字的每一个可能组合。使用每个组合将右侧单元格填充为1,其余单元格填充为0。希望它能帮助你。祝你好运

最新更新