我收到了来自 lonpos.cc 的大脑拼图作为礼物。我很好奇有多少不同的解决方案,我非常喜欢编写算法和代码,所以我开始编写一个应用程序来蛮力它。
拼图看起来像这样:http ://www.lonpos.cc/images/LONPOSdb.jpg / http://cdn100.iofferphoto.com/img/item/191/498/944/u2t6.jpg
这是一个 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 或类似的东西。
- 检查“无效”板,也就是如果一块无法触及(完全装箱)。
有人对我如何更快地做到这一点有任何创造性的想法吗?或者有什么方法可以数学计算有多少种不同的组合?