Algorithm 拼图/拼图的求解算法

Algorithm 拼图/拼图的求解算法,algorithm,logic,Algorithm,Logic,我一直在考虑一种解决小难题的算法。我在internet和stackoverflow上发现了不同的算法,但它们在某些方面不能满足我的需要: 我的拼图是一种颜色,没有图像/图案/。。。在他们身上 零件的每个边缘可以是8个选项中的一个,与图片上的选项类似(例如,您可以将零件描述为ABCD、cdab、cBBb、ADcb);没有比这更复杂的结构或类似的东西了 我想解决的难题不是太大,没有比8x8更大的 角点/egde块没有特定的边,结果将不是一个干净的矩形 不是我所有的难题都能解决 零件可以旋转,但不能

我一直在考虑一种解决小难题的算法。我在internet和stackoverflow上发现了不同的算法,但它们在某些方面不能满足我的需要:

  • 我的拼图是一种颜色,没有图像/图案/。。。在他们身上
  • 零件的每个边缘可以是8个选项中的一个,与图片上的选项类似(例如,您可以将零件描述为ABCD、cdab、cBBb、ADcb);没有比这更复杂的结构或类似的东西了
  • 我想解决的难题不是太大,没有比8x8更大的
  • 角点/egde块没有特定的边,结果将不是一个干净的矩形
  • 不是我所有的难题都能解决
  • 零件可以旋转,但不能转动
  • 每个拼图部分都是独一无二的

所以我的出发点是蛮力-将工件0放置在(0,0)位置,然后开始尝试(0,1)中的任何剩余工件,直到合适为止,然后移动到(0,2)等。在任何步骤中,如果没有适合该空间的工件,取出先前适合的工件,并尝试为该正方形找到新的适合

我无法证明这一点,但我怀疑,填充碎片时,您更有可能评估具有两个约束的碎片(也就是说,与其做较大的正方形,2x2、3x3、4x4,移出),终止速度会比只做行更快

它让我想起了那些3x3的拼图游戏,你可以看到带有动物头尾的方形拼图。一个优化是计算成对之间的不匹配-如果你的
a
a
多得多,那么你知道
a
将倾向于位于拼图的边缘,但在8x8拼图中,你的边内比要小得多,所以这种差异不太可能有用,我也没有将其集成到算法中的好主意

(编辑)再想一想,如果没有解决方案,我想数数能让你做的第一件事就是提前退出。NxN网格具有必须满足的
2*N*(N-1)
内部匹配。如果
min(A,A)+min(B,B)+min(C,C)+min(D,D)<2*N*(N-1)


(编辑2)在我想要的位置有abs()。哦。

看起来您也可以有多种解决方案?此外,旋转但不旋转,您的意思是可能翻转?是的,可以有多种解决方案。零件不能倒置。它们可以旋转,但它们只是画在一边。对不起,我不知道如何计算
|A-A |+| B-B |+| C-C |+| D-D |
。它不需要是NxN,也可以是NxM。对不起,应该详细说明一下-在该上下文中,A是出现在片段集中的NUB的总数,A是
A
NUB的总数。取差值的绝对值,我们就得到了可以形成的最大A-A匹配数。如果没有足够的匹配项来填这个谜题,你就被击沉了;请注意,相反的说法是不正确的,如果它们排列不正确,那么拥有足够的可能仍然不会产生任何解决方案。我没有发现我的谬误——我认为应该是
<4N
<2N+2M
。我的错误在哪里?4N或2N+2M将是边数;该总和设置了匹配条件数量的上限。如果上限小于所需的匹配数,则无法工作。一个
NxM
矩阵中的内部约束数应该是
(N*(M-1))+(M*(N-1))
我认为
A
s是一种特殊的nub,
A
装配孔(或相反)?然后我会计算所有不适合任何孔的NUB,并将其与边NUB/孔的数量进行比较?也许我误解了“在那个上下文中,A是出现在一组片段中的一个nub的总数,A是一个nub的总数。”?如何确定“集合中出现的总数[…]”和“总数”?