【发布时间】:2015-09-06 22:40:47
【问题描述】:
我有 11 个 64 位数字的列表(大小约为 36)。一种组合 - 每个列表一个元素将形成一个包含 11 个元素的列表。我需要找到这样的组合,即所有 11 个元素的 xor 操作将产生幻数(FFFF FFFF FFFF FFFF 十六进制格式)。
使用理解列表创建所有可能的组合然后迭代直到达到条件的“蛮力”方法是不切实际的:可能的组合数量巨大。
当我尝试在 8x8 板上解决 2D 拼图时会出现此问题。有 11 位数字和 64 位数字(二进制形式)表示该板上的图形形状和位置。这就是为什么有 11 个列表,其中包含每个图形的所有可能位置。当它们之间没有交叉时,所有图形都将很好地贴合在板上。
我有命令式编程背景,但我感觉 Haskell 可以比“意大利面条”命令式语言解决方案以更易读和易于理解的方式解决此类问题。
【问题讨论】:
-
如果你到目前为止保持所有数字的 OR 并且当一个数字 AND OR'ed 数字非零时不递归,你可能会大量减少组合。通过使用 XOR,您可以重新打开可以排除的路径。
-
顺便说一句,你的问题听起来像exact cover,有非暴力算法。
-
@M Oehm 感谢您指出正确的方向 - Donald Knuth 算法 X 可能是一个解决方案。现在只需要 Haskell 代码。
-
跳舞链接在 Haskell 中可能看起来不太好。毫无疑问有人已经做到了。
-
对于它的价值,这是某人的解决方案...github.com/jaapterwoerds/algorithmx/blob/master/src/…。虽然不相信效率。绝对没有舞蹈链接。