块拼图求解 C++ 算法

Posted

技术标签:

【中文标题】块拼图求解 C++ 算法【英文标题】:Block Puzzle solving C++ algorithm 【发布时间】:2013-02-22 20:58:40 【问题描述】:

我想制定一个算法来解决Block Puzzles,但要尽可能高效。我已经做了简单的方法(回溯)。

我将所有内容都表示为矩阵 - 块必须适合的大矩阵在开始时全部为 0,如果空间已满,则块为 1,如果空间为空,则为 0。 现在,下一个可能更有效的想法是在转到下一行之前始终验证一行是否完整。我的意思是我可能有一个表示为0 1 0 1 1 1 0 1 0 (穿过)。如果十字架被放在角落里,程序将无用地为无效的解决方案进行整个回溯,因此它应该返回并尝试另一件。

如果有必要,我可以提供一段代码,正如我所说,我只做了简单的低效回溯。 有没有人有更好的想法?在这种情况下可以使用动态规划吗?

【问题讨论】:

也许,当一个棋子被放置时,你计算与放置的棋子中任何零相连的零的数量,如果这个数字小于最小的未放置棋子中 1 的数量,那么你知道放置的棋子错了吗? 请给我更多细节。最大尺寸是多少,..limits? 不是真正的问题,只是想尝试一下。假设限制是 [INT_MAX/2][INT_MAX/2] 的矩阵,因此最大件数是 INT_MAX。与问题无关:) 【参考方案1】:

把问题想象成一个图:节点是可以排列块的各种状态,边是从一个节点到另一个节点的可能移动。那么解就是当前位置到目标的最短距离,可以用Dijkstra算法计算出来。

【讨论】:

我刚开始学习图论,目前正在阅读 Dijkstra 的算法,但我发现有点难以理解你的意思。我知道该图表将包含阅读的片段。但是如何确定何时达到目标以及如何表示所有内容以便将碎片放入容器中? 您已经从第一个解决方案中获得了节点的表示。该图表示为邻接列表:从每个节点,这里是一次移动可以到达的所有节点。目标是所需的最终节点。在某些情况下,包括您的情况,可能有多个可能的目标,因此您可能需要单源最短路径算法(有多个),而不是 Dijkstra 算法;您可能需要一种使用广度优先搜索的算法,这样您就可以在达到任何目标后立即退出。

以上是关于块拼图求解 C++ 算法的主要内容,如果未能解决你的问题,请参考以下文章

移动迷宫——拼图游戏

移动迷宫——拼图游戏

优化回溯算法求解数独

BFS算法在尝试解决15个拼图JAVA时没有结束

如何为手机构建滑块拼图软件

日历拼图C++解法