square869120Contest #5 I - Collecting Gems is Fun

条件分岐しまくったらWAが出てしまいコンテスト中にはACできなかったがその後無事4位(コンテスト中)に該当する点数を取れたので適当に方針を書く

https://beta.atcoder.jp/contests/s8pc-5/submissions/2365849

コードが非常に汚いのは方針事体はものすごくシンプルなので、なるべく早くACしたかったからです(それが故に墓穴を掘りましたが

まず重要な相対位置の設定に関してですが、

  • (0, -1)
  • (0, -2)
  • (0, -3)
  • (0, 1)
  • (0, 2)

にしました

何故こうしたのかは後々説明します

次に移動の仕方についてですが、相対位置の設定を見れば分かる通り一番最初に右に3個ズレます
その後はずっと下に行って、一番下に着いたら右に6個ずれてずっと上に行って右に6個ズレて...の繰り返しです

移動中に close か get-close が出てきたらまずはに進みます
ここで仮に far か get-far が出れば、もとのいちに戻り close であれば右にあるので取りに行きます

これにより相対位置 (0, 2) と (0, 1) のみ、またはそこにプラス (0, -1) に宝石がある場合は (0, 2) で6回、(0, 1)で4回の移動で取ることができます

もう一度 close か get-close が出れば同じように左に進みます
ここで far か get-far であれば、↑と同じような操作をすれば (0, -2) と (0, -1) プラス (0, 2) で8回, (0, 1) で6回の移動で取ることができます

もう一度 close か get-close も↑と同じ動作を行います

これにより宝石のある範囲が移動する回数になり

(0, -1) (0, 1) 4回
(0, -1) (0, 2) 6回
(0, -2) (0, 1) 6回
(0, -2) (0, 2) 8回
(0, -3) (0, 1) 8回
(0, -3) (0, 2) 10回

で宝石を取りに行くことができます
なぜ左から取るようにしたかというと右は未探索で他の宝石が入ってしまうためです

左に3、右に2 という理由について
まず何故左右でちがうかというと、仮に 3, 3 の場合、右に取りに行く時に誤動作する確率が多くなるからと↑のコードでは改修の際に消してしまいましたが枝刈りの余地を残せるからです(もしかしてこれが原因?

3 と 2 である理由については感覚的にこれが一番最適かなと思ったからです(適当)
100 / (右 + 左 + 1) * 100 + (200 - 同じ探索範囲内の数) * ↑の平均回数
でスコアがざっくり求まるので案外簡単に最適っぽいのは求められるのですが、残念ながら今回はWAだったため調整ができませんでした

提出人数が少なかったりそもそも適当に点数稼いで終わりの人も多そうですが自分の割にはとても良い得点が出たので方針載せておきました