查找具有一组连续1的{2}数组的二维数组中每个可能的位排列

时间:2017-03-16 19:32:27

标签: algorithm math multidimensional-array permutation bitarray

下面我已经表示了2D位阵列中2位的排列(1s是红色的)。左边的矩阵有一组连续的1,但右边的矩阵有2。

enter image description here enter image description here

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

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

我的问题与这些问题类似,但不同:

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

2 个答案:

答案 0 :(得分:0)

所以,我发现OEIS(整数序列的在线百科全书)有一个来自<!-- Checklist: Prototype --> <article class="divider"> <h3>Prototype Property</h3> <p>The prototype property adds new properties or methods to Javascript objects.</p> <p>NOT WORKING!!!!!!!!!!!!!</p> <p id="prototype-example"></p> <button onclick="myHouse.methodexample()">Click Me</button> </article>的序列,用于&#34;非零n X n二进制数组的数量,所有1&#39; s连接&#34 ; (A059525)。除了固定在1个细胞宽(triangular numbers)或23个细胞宽度的网格外,它们不提供任何公式。还有sequence for 4 x n,但没有公式。

答案 1 :(得分:0)

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

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

  1. n = width * height
  2. 从0到n - 1
  3. 从左到右,从上到下枚举块
  4. 将块固定在位置0。
  5. 生成从位置0延伸的1到n个块之间的所有连续解决方案
  6. 忽略位置0并将块固定在位置1
  7. 查找从位置1延伸的1和n - 1块之间的所有连续解决方案
  8. 继续,直到您到达位置n
  9. 您可以根据以下规则放置您的作品,回溯每个深度的下一个展示位置:

    1. 如果该空位没有其他邻居,则在最近放置的作品的左侧如果放在上一行的上方。
    2. 如果该空缺没有其他邻居,则在最近放置的一排最左边可用的一块。
    3. 在最近放置的作品的右边(如果相邻的作品存在)
    4. 在下一行,最左边的空位,使得上排在任何连续的右边剩下的邻居之上有一块
    5. 任何回溯位置的下一步移动首先可以移动到回溯位置的右边或下面一行(遵守之前的4条规则)