昨天我只是在玩拼图游戏,突然想到了解决这个问题的算法。
作为人类,我遵循以下步骤:
- 将所有拼图分成三部分:单面平坦边、双面平坦边和没有任何边缘。
- 将单面平坦边的拼图分开,它们将成为图像的角落。
- 将单一平坦边缘的拼图分开放置,它们将形成图像的四个边缘。
- 最后,没有边缘的拼图将形成图像的内部。
- 匹配颜色和图像拼图,以将拼图组合在一起。
我在想,哪种高效的算法可以更有效地解决这个拼图难题,以及使用什么数据结构会提供最优的高效解决方案。
谢谢。
昨天我只是在玩拼图游戏,突然想到了解决这个问题的算法。
作为人类,我遵循以下步骤:
我在想,哪种高效的算法可以更有效地解决这个拼图难题,以及使用什么数据结构会提供最优的高效解决方案。
谢谢。
请确保扫描每个部分的男/女性--这将减少搜索量一半。
我不认为以人类的方式去实现会很有帮助-计算机可以每秒查看所有块多次,而将块分成角落、边缘和内部块并没有(大)优势,特别是因为它们只有三个类别且大小差异很大。
给定一组所有块的图像,我会尝试为每个块或边推导出一个简单的描述符。描述符必须包含关于块的粗略形状和颜色的信息,或者四条边各自的信息。给定一个由1000个块组成的拼图,共有4000个边,且总有两个相等(忽略拼图的边框)。因此,描述符必须能够区分2000个边,需要至少11位。
将一个块分成3 x 3的棋盘格模式,并赋予每个边三种颜色-每通道8位,我们已经有72位。我最初倾向于建议减少颜色分辨率,但这似乎不是一个好主意-例如,蓝天可能真正受益于高颜色分辨率。请注意,计算颜色可能需要将块从背景中分离出来,并尝试将边与水平和垂直轴对齐。
在非常均匀的区域,比如蓝天,颜色信息可能不足以找到良好的匹配,需要额外的几何信息。我会尝试通过其曲率或导出的度量来描述边缘的形状。也许每个边缘采样十到二十个点。这可能又依赖于背景分离和边缘对齐。在这个问题上,我想到了一个有趣的解决方案,可以通过一系列步骤逐渐增加成本来解决它。
将所有拼图分成两组。测试它们是否能够拼合在一起。如果不能,尝试另一块之前未见过的拼图。如果可以,将该组放入正确的堆中。重复此步骤,直到所有的拼图都被匹配成一对。
从正确的堆中组合成两组拼图的集合,即{{1,2},{5,6}}。看看其中至少一块拼图是否与另一组中的至少一块拼图相匹配。如果不是,请尝试之前未见过的其他组合。如果是,则将两组合并为一组四个拼图,以正确的方向放置,并将其放入正确的堆中。重复此步骤,直到所有的四个拼图都被找到。
重复以上步骤,直到最后一个问题,即第n/2组与第n/2组相结合。
不确定这个计算时间会是多少。