【问题标题】:Finding unique combination using recursion使用递归查找唯一组合
【发布时间】: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/…。虽然不相信效率。绝对没有舞蹈链接。

标签: algorithm haskell


【解决方案1】:

set-cover 包为此类问题提供了解决方案。

【讨论】:

    猜你喜欢
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多