解决平铺/拼图游戏的算法

标签 algorithm logic

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

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

Example puzzle parts

最佳答案

所以我的起点只是蛮力——将棋子 0 放在 (0,0) 位置,然后开始尝试 (0,1) 中的任何剩余棋子直到一个适合,然后继续 (0 ,2), 等等。在任何一步,如果没有适合该空间的棋子,请取出之前适合的棋子并尝试为该方 block 找到新的棋子。

我无法证明这一点,但我怀疑填充碎片会使您更有可能评估具有 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(),而我本想有 min()。糟糕。

关于解决平铺/拼图游戏的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121903/

相关文章:

python - 这个桶排序实现在做什么?

string - 用于测量两个字符串中出现的大小 >=2 的子序列数量的指标

python - 莉莉家庭作业 hackerrank 失败的测试用例

php - 模拟搜索并获取返回行的行号(从总数中)

c# - 按元素选择最重复的项目

logic - Prolog - 查找当前目录, 'tell' 谓词的相对目录

algorithm - 根据 n 项、总面积和 H :W ratio 创建最优网格

javascript - Chrome 使用什么抗锯齿线条绘制算法?

c - 如何在没有 vector/递归的情况下为类似斐波那契的序列编写 C 程序?

C++ : Checking the contents of a string