2

Lisp でマインスイーパ ソルバーを実装しようとしています。これはまれな問題ではないことはわかっていますが、それを解決するのに役立つ記事は見つかりませんでした。最初に、カバーされていないフィールドの数字を入力として地雷原を持っています。すべての地雷が見つかったら、アルゴリズムを終了する必要があります。したがって、すべてのステップで、マイニングされたフィールドのリストにどのフィールドを入れることができるかを確認し、マイニングされていないフィールドのリストから 1 つのフィールドを選択して開く必要があります。後で、マイニングされたフィールドのリストが完成しているかどうかを確認し、はいの場合はアルゴリズムが完了しています。助けていただければ幸いです。ソースコードは求めませんが、良いアイデアが必要です。私はこの種の問題を経験していません。


A* アルゴリズムを使用する必要があります。そして、未開封のフィールドをすべて開く必要はありません...採掘されたすべてのフィールドの位置を見つける必要があります。そしてもちろん、それを行うには最短のパスでなければなりません。採掘されたすべてのフィールドの位置を見つけると、アルゴリズムは終了します。したがって、もう一度、最適な数の開かれたフィールドを持つすべての採掘されたフィールドを見つける必要があります。そしてもちろん、すべての安全な未開封フィールドの 1 つを選択するのに役立つアルゴリズムのヒューリスティックが必要です。そして、開かれていない安全なフィールドのリストは、開くたびに決定する必要があります。したがって、メイン関数を呼び出す必要があります。その関数は、マイニングされたすべてのフィールドを見つけたかどうかをチェックします。そうでない場合は、すべての安全な隣接する未開封のフィールドをパスのリストに追加する必要があります。そして、最良のヒューリスティックを持つパスが選択されます

4

2 に答える 2

3

私は大学での最初の年に掃海艇ソルバーを実装したので、いくつかのヒントを与えることができます. (これは A* アルゴリズムを使用していません)

  1. 重要 - すべての位置が解けるわけではありません。

  2. 高度な難易度の場合、地雷フィールド全体のバックトラックは少し複雑です (複雑 = 時間がかかります。30x30 フィールドに 100 個の地雷を配置するすべての可能性を検討してください)。

  3. 人間がマインスイーパを解決するのと同じように、ローカルですべてを解決できます。これの可能性は、すべてを解決するのではなく、続行する方法のヒントをユーザーに与えることです。

例:

  1. 解決を行う別の地雷原を用意する
  2. 解決された (数値/既知の鉱山) セルが十分に近い (2 セルの距離) 未解決のセルをすべて見つけます。
  3. そのようなセルごとに、そのセルを中心に 5x5 の近傍を取り、すべての可能性を見つけ (バックトラック)、可能性に共通点 (地雷/非地雷) があるかどうかを確認します。非鉱山。
  4. 何かを発見できるまで繰り返します。
  5. 何も発見できず、残りの地雷の数が十分に少ない場合は、フィールド全体をバックトラックしてみることができます。

記憶が正しければいいのですが、5x5 の領域で十分な理由をいくつか証明しましたが、それはほぼ 10 年前のことです。

于 2013-04-07T15:34:43.397 に答える
0

A* アルゴリズムは必要ありません。その目的は、グラフ内の最短経路 (マップ内の 2 つの場所の間の最短経路や、パズルを解くための最小移動量など) を見つけることです。バックトラッキングと呼ばれる手法を使用することをお勧めします。

開いていないフィールドがある限り、開いているフィールドの隣にある未開いているフィールドを選択し、暫定的に鉱山としてフラグを立てます。次に、前のフィールドと開いているフィールドに隣接している未開封のフィールドを見て、隣接する数値と矛盾しない場合は、そのフィールドも地雷としてフラグを立てます。矛盾する場合は、代わりに安全であるとフラグを立てます。 . 継続する。最終的に、現在の領域を取り囲む未開封のフィールドをすべて調べて、フィールドに安全または危険のフラグを立てる方法の 1 つを見つけることができます。ただし、これはいくつかの推測に基づいているため、推測を行った最後のフィールドに戻り、反対の推測を行い、再び前方に移動して、別の可能なフラグの組み合わせを取得する必要があります。次に、さらに遡って、推測を修正します。これは、再帰を使用して非常にきれいに実装できます。最終的に、可能なフラグの組み合わせのコレクションができあがります。考えられるすべてのフラグの組み合わせで安全なフィールドが見つかった場合は、そのフィールドを開きます。それ以外の場合は、できるだけ多くのフラグの組み合わせで安全なフィールドを選択してください。

于 2013-04-07T15:23:32.847 に答える