math - 获得所有可能的限制组合的算法
问题描述
我有数字 0 到 7。可能的组合必须包含所有数字。一个解决方案有 8 位数字。除此之外,这些规则适用:
0 comes before 1
1 comes before 3
2 comes before 3
4 comes before 5
6 comes before 7
示例解决方案:01234567
,20134567
无效的解决方案:01123456
或31204567
首先:由于这不是大学的练习,而是我在编写一个真正的程序时遇到的一个真正的问题,我什至不确定是否存在一个简单的解决方案。但如果有,我将不胜感激。
解决方案
为了使事情更有效(并且假设解决方案比排列少得多),一个想法是:
- 一一生成所有排列。
- 不要以通常的方式解释排列,而是将其解释为告诉每个数字它将去到哪个位置。因此,给定一个排列
(3, 2, 0, 1)
,将其解释为 0 到 pos 3,1 到 pos 2,2 到 pos 0,3 到 pos 1(所以,逆排列:(2, 3, 1, 0)
)。然后,接受或不接受排列的测试要简单得多。
这是 Python 中的一个实现,但同样的想法可以应用于任何编程语言:
from itertools import permutations
num = 0
q = [0 for _ in range(8)] # create a list to fit 8 values
for p in permutations(range(8)):
if p[0] < p[1] < p[3] and p[2] < p[3] and p[4] < p[5] and p[6] < p[7]:
for i, pi in enumerate(p):
q[pi] = i
num += 1
print(num, q)
输出:
1 [0, 1, 2, 3, 4, 5, 6, 7]
2 [0, 1, 2, 3, 4, 6, 5, 7]
3 [0, 1, 2, 3, 4, 6, 7, 5]
4 [0, 1, 2, 3, 6, 4, 5, 7]
5 [0, 1, 2, 3, 6, 4, 7, 5]
6 [0, 1, 2, 3, 6, 7, 4, 5]
...
1257 [4, 6, 7, 5, 2, 0, 1, 3]
1258 [6, 4, 5, 7, 2, 0, 1, 3]
1259 [6, 4, 7, 5, 2, 0, 1, 3]
1260 [6, 7, 4, 5, 2, 0, 1, 3]
推荐阅读
- java - 混淆密码 LDAP AD
- scala - 无法在运行时检查内部特征的模式匹配?
- javascript - 文本字段不通过单击按钮读取值,但直到我将值物理添加到文本字段中
- android - TextInputEditText 的 OutlinedBox 不起作用
- jenkins-pipeline - jenkins 多分支管道中的 SCM 轮询
- delphi - 如何在delphi中获取操作系统的语言是双字节的?
- java - 访问 https URL 时出现 404 错误 - Java,但与 POSTMAN 或 SOAPUI 一起工作正常
- json - 即使在 Ajax 调用上,Web Api 参数对象也为空
- python-3.x - 谷歌分析与 python 的连接
- android - 从 GL_TEXTURE_EXTERNAL_OES 读取到 GL_TEXTURE_2D 有性能问题和故障