解决平铺/拼图的算法

时间:2013-02-27 20:37:47

标签: algorithm logic

我一直在考虑解决小谜题的算法。我在互联网和stackoverflow上找到了不同的algortihms,但它们在某些方面不能满足我的需求:

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

Example puzzle parts

1 个答案:

答案 0 :(得分:2)

所以我的出发点只是蛮力 - 在0,0位置放置0,然后开始尝试(0,1)中的任何剩余部分直到一个适合,然后继续前进到(0) ,2)等。在任何步骤中,如果没有适合该空间的碎片,请取出先前合适的碎片并尝试找到该方块的新配合。

我无法证明这一点,但我怀疑填充碎片是为了让你更有可能评估一个有2个约束的棋子(也就是说,而不是做更大的正方形,2x2,3x3,4x4,搬出)将比终止行更快地终止。

它让我想起那些3x3谜题,你有动物头部和尾部的方形碎片。一个优化就是计算对之间的不匹配 - 如果你有Aa更多,那么你知道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(),我的意思是min()。糟糕!