Performance 用蛮力拼图

Performance 用蛮力拼图,performance,algorithm,puzzle,Performance,Algorithm,Puzzle,lonpos.cc给了我一个大脑拼图作为礼物。我很好奇有多少不同的解决方案,我非常喜欢编写算法和代码,所以我开始编写一个应用程序来强制执行它 谜题如下所示:/ 这是一块20x14点的板。所有的拼图都可以翻转和翻转。我写了一个应用程序,其中每一块和拼图都是这样呈现的: 01010 00100 01110 01110 11111 01010 到目前为止,我的应用程序相当简单 它需要一张单子和一块空白板,弹出单子0 在每个方向上翻转它,并尝试将其放置在每个x和y坐标上。如果它成功地放置了一块,它会将

lonpos.cc给了我一个大脑拼图作为礼物。我很好奇有多少不同的解决方案,我非常喜欢编写算法和代码,所以我开始编写一个应用程序来强制执行它

谜题如下所示:/

这是一块20x14点的板。所有的拼图都可以翻转和翻转。我写了一个应用程序,其中每一块和拼图都是这样呈现的:

01010
00100
01110
01110
11111
01010
到目前为止,我的应用程序相当简单

它需要一张单子和一块空白板,弹出单子0 在每个方向上翻转它,并尝试将其放置在每个x和y坐标上。如果它成功地放置了一块,它会将新电路板的一个副本传递给一个递归函数,并尝试它们的所有组合

用伪代码解释:

bruteForce(Board base, List pieces) {
    for (Piece in pieces.pop, piece.pop.flip, piece.pop.flip2...) {
        int x,y = 0;
        if canplace(piece, x, y) {
            Board newBoard = base.clone();
            newBoard.placePiece(piece, x, y);
            bruteForce(newBoard, pieces);
        }
        ## increment x until x > width, then y
    }
}
现在,我正试图找到让这更快的方法。到目前为止我想到的事情:

使其并行实现,现在使用4个线程。 对碎片进行分类,并且只尝试将适合的碎片放置在我们正在尝试适应的x,y空间中。如果我们在最后一排,从我们的位置到最后一排只有4分,不要尝试那些8分高的。 不复制电路板,而是使用placePiece和removePiece或类似的东西。 检查是否有无效的电路板,也就是说,如果一块电路板无法完全装入盒中。
有人对我如何更快地完成这项工作有什么创造性的想法吗?或者用数学方法计算出有多少种不同的组合

我看不到任何明显的快速做事的方法,但这里有一些可能有用的提示

首先,如果忽略凹凸,将使用1x2块填充6x4网格。每个块都有6个位置,其中可以有一个凸起或一个孔。所以,您试图找到块的排列方式,以便在每个边上,凹凸和孔匹配。此外,使用此信息可以更有效地表示各个部分


接下来,我建议尝试所有方法在特定地点放置一个区块,而不是在任何地方播放特定区块。这将减少错误跟踪的数量。

我看不到任何明显的快速操作方法,但这里有一些提示可能会有所帮助

首先,如果忽略凹凸,将使用1x2块填充6x4网格。每个块都有6个位置,其中可以有一个凸起或一个孔。所以,您试图找到块的排列方式,以便在每个边上,凹凸和孔匹配。此外,使用此信息可以更有效地表示各个部分

接下来,我建议尝试所有方法在特定地点放置一个区块,而不是在任何地方播放特定区块。这将减少你走下的错误轨迹的数量。

这看起来像是。您基本上希望用给定的片段覆盖板上的所有字段。我可以推荐,由Donald Knuth出版。在中,您可以找到一个清晰的示例,该示例将使您对其工作原理有一个很好的了解

您基本上建立了一个系统,该系统跟踪所有可能的方法,以便在电路板上放置特定的块。通过放置一个块,可以覆盖字段上的一组位置。这些位置不能用于放置任何其他块。然后,在放置另一个块之前,问题设置中的所有可能性都将被删除。跳舞的链接允许快速回溯和删除可能性。

这看起来像。您基本上希望用给定的片段覆盖板上的所有字段。我可以推荐,由Donald Knuth出版。在中,您可以找到一个清晰的示例,该示例将使您对其工作原理有一个很好的了解


您基本上建立了一个系统,该系统跟踪所有可能的方法,以便在电路板上放置特定的块。通过放置一个块,可以覆盖字段上的一组位置。这些位置不能用于放置任何其他块。然后,在放置另一个块之前,问题设置中的所有可能性都将被删除。跳舞的链接允许快速回溯和删除可能性。

您可以使用现有的解决方案:该链接现在似乎已经死了,但我希望它很快会好起来。同时,搜索毛刺工具。它的功能与您的功能完全相同,只是它删除了不合理的子解决方案非常酷,似乎sourceforge遇到了一些问题,但这正是我在第4点中所想的,试图去除不适合的内容。此链接起作用:您可以使用现有的解决方案:该链接到目前为止似乎已经失效,但我希望很快好起来。同时,搜索毛刺工具。它的功能与您所做的完全相同,只是它删除了不合理的子解决方案非常酷,似乎sourceforge遇到了一些问题,但这正是我在第4点中所想的,试图去除不适合的内容。此链接起作用:我想我明白您的意思,但我
我绞尽脑汁想如何在实践中做到这一点。有些曲子真的很奇怪,比如上面的let on here:here:。它们以一种很难简化的方式交叉到其他块中。我可以在我的canPlace函数中检查放置的块是否产生了一个可以解决的电路板。例如,如果它将一个点完全框起来,使其无法到达。或者让剩下的碎片无法触及。。。明天我一定会再吃一点:仔细看看。如果你忽略凹凸和孔洞,图片中的所有块都有一个基本的2x1形状。我想我明白你的意思,但我正在努力想象如何在实践中做到这一点。有些曲子真的很奇怪,比如上面的let on here:here:。它们以一种很难简化的方式交叉到其他块中。我可以在我的canPlace函数中检查放置的块是否产生了一个可以解决的电路板。例如,如果它将一个点完全框起来,使其无法到达。或者让剩下的碎片无法触及。。。明天我一定会再吃一点:仔细看看。如果忽略凹凸和孔洞,图片中的所有块都有一个基本的2x1形状。这看起来确实与封面问题完全相同!我现在有了代码,可以在每一步中复制电路板。查看一个分析器,它大约占当前代码执行的20%。65-70%是用于查看电路板设置是否有效的代码。因此,快速完成这些操作绝对是成功的关键!这就是舞蹈链接结构的好处:你不需要检查你的板是否有效。它只是放置一个片段并擦除所有冲突的其他片段。沿着这条路走的每一步,你都有一块有效的板,上面有i块。如果i==totalNrPieces,您就有了一个解决方案。这看起来确实与封面问题完全一样!我现在有了代码,可以在每一步中复制电路板。查看一个分析器,它大约占当前代码执行的20%。65-70%是用于查看电路板设置是否有效的代码。因此,快速完成这些操作绝对是成功的关键!这就是舞蹈链接结构的好处:你不需要检查你的板是否有效。它只是放置一个片段并擦除所有冲突的其他片段。沿着这条路走的每一步,你都有一块有效的板,上面有i块。如果i==totalNrPieces,则有一个解决方案。