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などを使用します。
- 「無効な」ボードをチェックします。これは、ピースに到達できない場合(完全にボックス化されている場合)です。
誰かが私がこれをより速くすることができる方法について何か創造的なアイデアを持っていますか?または、いくつの異なる組み合わせがあるかを数学的に計算する方法はありますか?