用于组装简化拼图的算法,其中识别所有边缘

时间:2015-10-10 08:58:33

标签: c++ algorithm

是否有任何类型的算法可以帮助和加速拼图拼图的构造,其中边缘已经被识别并且每个边缘保证恰好适合另一个边缘(或者如果该块是角落则没有边缘或边境片)?

我在这里得到的数据集大致由以下结构表示:

struct tile {
    int a, b, c, d;
};

tile[SOME_LARGE_NUMBER] = ...;

每个边(a,b,c和d)在拼图中唯一索引,以便只有一个其他拼贴与边相匹配(如果该边有匹配,因为边角和边框拼贴可能不匹配)。

不幸的是,过去没有任何保证。数组中tile的顺序是随机的,唯一的保证是它们从0索引到SOME_LARGE_NUMBER。同样,侧面UID也是随机的。它们都属于一个连续的范围(该范围的最大值取决于瓷砖的数量和完成的拼图的尺寸),但这是关于它的。

我试图以最有效的方式组装拼图,这样我最终可以通过二维数组使用行和列来解决已完成的拼图。我应该怎么做呢?

2 个答案:

答案 0 :(得分:1)

tile[]数据定义了无向图,其中每个节点与2,3或4个其他节点链接。选择仅包含2个链接的节点,并将其设置为原点。此节点的两个链接定义了X和Y轴。如果您按照X轴链接进行操作,您将到达一个带有3个链接的节点 - 一个指向原点,另外两个指向正X和Y方向。您可以轻松识别X方向的链接,因为它将带您到另一个有3个链接的节点(而不是4个)。

通过这种方式,您可以轻松找到一侧的所有部件,直到您到达远角,这里只有两个链接。到目前为止发现的所有碎片中,唯一未经测试的链接指向Y方向。这样可以轻松放置下一排碎片。只需继续,直到所有部件都已放置。

答案 1 :(得分:-1)

这可能不是您想要的,但是因为您要求"最有效的方式" ,这是一个相对较新的科学解决方案。

拼图是一个复杂的组合问题(NP-complete),需要学术界的一些帮助才能有效地解决它们。最近的算法最近被genetic algorithms打败了。

根据您的拼图大小(以及学习科学内容的愿望;))您可能对本文感兴趣:A Genetic Algorithm-Based Solver for Very Large Jigsaw Puzzles 。 GA会以惊人的方式解决您在经典算法中遇到的一些问题。

请注意genetic algorithmsembarrassingly parallel,因此可以直接在并行计算机上进行计算,例如多核CPU,GPU(CUDA / OpenCL)甚至分布式/云框架。这使它们快了几百到几千倍。 GPU加速的GA解锁了传统算法无法使用的拼图尺寸。