【问题标题】:Find every possible permutation of bits in a 2D array that has a single group of contiguous 1s在具有一组连续 1 的 2D 数组中查找所有可能的位排列
【发布时间】:2017-08-08 04:04:14
【问题描述】:

在下面,我表示了 2D 位数组中的 2 个位排列(1 为红色)。左边的矩阵有一组连续的 1,但右边的矩阵有 2。

        

我想遍历这样一个数组中所有可能的二进制值排列,该数组具有一组连续的 1。我知道,对于像上面这样的 10×7 网格,当您包含非连续排列时,有 2(10 × 7) 排列,但我希望通过排除非连续排列,我将能够在合理的 CPU 时间内完成所有任务。

说到合理性,我也对确定有多少排列是连续的算法感兴趣。

我的问题与以下类似但不同:

感谢任何帮助。我有点卡住了。

【问题讨论】:

  • 您希望有多少行和多少列?
  • 即使你只看连续 1 的数组,我认为这个数字对于 10x7 来说仍然太大了。
  • 我同意这个数字对于 10x7 来说仍然太大。您应该尝试使用较小尺寸的算法,并查看它如何扩展以了解您的问题的合理上限是多少。我对算法有一些想法,但最好使用像 Python 这样的语言,它具有集合排列和冻结的排列集合集,以及类似类型。我的想法仍然会出现大量重复,这需要进行测试以避免添加重复。
  • 我也怀疑是否存在一种相当简单的算法来仅生成连续的 1 组,而这在内部不起作用,因为“生成所有并过滤掉不连续的”,这完全超出了提高速度的最初目标.

标签: algorithm math multidimensional-array permutation bitarray


【解决方案1】:

所以,我发现 OEIS(整数序列在线百科全书)有一个来自 n = 0..7 的序列,用于“连接所有 1 的非零 n X n 二进制数组的数量”(A059525)。除了固定在 1 个单元格宽度 (triangular numbers) 或 23 单元格宽度的网格之外,它们不提供任何公式。还有一个sequence for 4 x n,但没有公式。

【讨论】:

    【解决方案2】:

    我能想到的两种方法。一种是遍历所有可能的序列,并为不连续的组设计一个测试,并设计一些方法来跳过保证不连续的大区域。

    第二种方法是尝试构建所有连续组集,这样您就不需要测试了。这是我将采取的方法:

    1. n = width * height
    2. 从左到右、从上到下从 0 到 n - 1 枚举块
    3. 在位置 0 处修复一个块。
    4. 生成从位置 0 延伸的 1 到 n 个块之间的所有连续解决方案
    5. 省略位置 0 并在位置 1 固定块
    6. 查找从位置 1 延伸的 1 和 n - 1 块之间的所有连续解决方案
    7. 继续直到到达位置 n

    您可以根据以下规则放置您的棋子,在每个深度回溯到下一个放置:

    1. 如果放置在前一块上方的行中,则位于最近放置的一块的左侧,前提是该空缺不存在其他邻居。
    2. 如果该空缺不存在其他邻居,则在最近放置的棋子行中最左侧的可用棋子上方。
    3. 最近放置的棋子右侧(如果存在相邻棋子)
    4. 在下一行,最左边的空位使得上行在任何相邻的右侧剩余邻居之上都有一块
    5. 任何回溯位置的下一步移动首先可用移动到回溯位置的右侧或下方行中(遵守前面的 4 条规则)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2015-12-31
      • 1970-01-01
      相关资源
      最近更新 更多