codingame Unleash the Geek に軽く参加した
とりあえず。
問題概要
- 鉱石を集めて回収する。
- ただし、鉱脈のある場所は分からない。
- レーダを配置することで、距離4以内の鉱脈が分かる
- 爆弾も設置できる。爆弾を設置した場所を掘ると爆発する。隣接して置くと誘爆する。
- 相手のロボットが何を持っているか分からない。
- HQから遠いほど、鉱脈は多く存在する。
成績
Gold 😫
ちゃ、ちゃんと参加してたらLegendary行ってたもん!!
コードも800行とかなりコンパクト。手抜きともいいますが。
戦略概要
ステートマシンを書きました
特記事項なし。お手軽だとおもいます。
シミュレーターは書きませんでした
大変だもん
移動速度が早い系は特に…
レーダを置く場所のうち、最初のいくつかについては事前に決め打ちします。
下手に動的に場所を決めるよりも、意外と効果がありました。(少なくともSilverでは)
const Point StaticRadarPoints[] = {{8, 3}, {8, 11}, {13, 7}, {18, 3}, {18, 11}, {23, 7}};
鉱石2個以上残っている場所に爆弾を埋め込みます
誘爆は意識していませんが、Gold以降では必要な気がしました。
Silver上位辺りだと、どうせ避けられるので、一切使わないという手もあったかもしれません。
相手が掘った場所は爆弾が埋め込まれただろうと解釈します
Digするとき、Robotは必ず移動しないことを利用します。
1ターン前の盤面と比較して、相手robotが動いていないならば、Digしているとみなせます
そのrobotの周囲に穴が増えていれば、そこを掘ったと分かります。
穴が増えていなけば、既にある穴を掘ったことになりますが、どの穴を掘ったかは分からないため、すべての穴をマークします。
公式のテンプレートを使いました
クラスが丁寧に定義されていて、そこそこ扱いやすかったです。
Point構造体にoperator==を追加したり、Robot構造体にAI構造体をもたせたり、適宜手を加えました。
普段自分は(y,x)で定義しているので、そこはバグを埋め込みやすかったです。
感想
振り返ってみると、最低限やるべきことをやっただけで工夫は殆ど無い気がしてきました。
勝ちに行くなら探索を書け