私は城壁とその周囲を表す行列(0と1を持つ)を持っています。壁に射手を置く
私の仕事は、できるだけ多くの周囲をカバーするように、壁に弓術師をn
置くことです。 2つのルールがあります。
:すべての射手は1の範囲にしている - 壁でない手段、彼は唯一の隣接するタイルの上に撮影することができます(各タイルは、8近傍を持っているが)、(フレンドリー・ファイアは、この中に禁止されていること軍!)。
:このような場合、その複数の射手は同じタイルで撮影することができます。そのタイルは1つだけカウントされます。
多項式時間に存在するものがあるかどうかわからないので、これは効果的な解を見つけるのに苦労しています。 ありますか?
私は最初のステップは、行列のすべてのタイルを評価するためにBFSアルゴリズムを使用することですが、私は効果的に第2のルールでそれを解決する方法がわかりません。ブルートフォースの解決策は非常に単純です - すべてのポジションを評価し、すべてを試してみてください。非常に効果がありません - 私はO(|可能なプレースメント|^n)と思っています。
簡単な例:
灰色のタイル壁を表します。タイルの中の数字は、そのタイルに置かれたアーチャーのカバレッジを表しています。確かに、オレンジ色のものを追加しました。これはタイルb2にアーチャーが立っているかどうかを表しています。そして、最後の情報 - 正しい解決策はb2とb6で、カバレッジは14です.b2とb4はできません。なぜなら、それらは11タイルしかカバーしないからです。
サンプルテストケースはありますか?隣接するタイルは4近傍または8近傍にありますか? –
問題をILPとして比較的容易に表現することができます。これにより、実用的な解を効率的に見つける方法が得られます。しかし、多項式時間は保証されません。 –
@JohnBupit隣接するタイルは8近傍です。簡単なテストケースを描いてここに投稿します。 – tomascapek