Marathon Match 122: Super Minesweeper

久しぶりに Topcoder の Marathon Match に参加しました。順位は5位でした。

問題概要

problem sample

マインスイーパーです。ただしルールに以下の違いがあります。

制約

方針

提出コードはこちらです。

最初の方針は通常のマインスイーパーの解き方を参考にしました。

基本的には、単純なバックトラッキングであり得る地雷の置き方を全列挙して、必ず地雷になるか必ず地雷にならないところを確定して開いていくのを繰り返します。

この方針では探索の実行時間が肝になるので以下の高速化が効果的でした。

実行時間が足りない場合

主にD=8D=8の一部のケースでは探索に時間がかかりすぎて、ほとんど開くことができずに終了してしまいます。このときは、探索の実行時間が一定 (タイムリミット / 14) を超えたらキャンセルして、近くの適当なマスを開いてヒントを増やして探索が速くなるのを期待します。

確定できるマスが存在しない場合

特にD=1,2D = 1, 2のケースではヒントの数が不十分で確定できるマスが存在しない場合があります。このときは適当に 1.0 / (今の開いた地雷の数 + 1 + 4.0 * 確率) と現在のスコアを比較して、現在のスコアが大きいなら終了します。