AtCoder ABC224

ABC224参加しました。

atcoder.jp

今回もC,D問題だけ。

C - Triangle?

解説 - AtCoder Beginner Contest 224

提出 #26766378 - AtCoder Beginner Contest 224

ベクトルの外積の性質を考えればすぐに解けます。

imagingsolution.net

for文で全探索すると、$ O(N^{3}) $の計算量ですが、頂点数が少ないので、間に合います。

D - 8 Puzzle on Graph

解説 - AtCoder Beginner Contest 224

提出 #26784267 - AtCoder Beginner Contest 224

一般化したスライドパズルと言えそうです。

ja.wikipedia.org

実際、コンテスト中に以下のようなページを見つけて使えそうだなとは思いました。

www.nct9.ne.jp

なので、あまり書くこともないですが...

スライドパズルの各盤面を頂点として持つグラフを考えます。盤面は解説にある通り文字列として持ってもいいです。入力例1だと、頂点"931456782"からスタートして、"123456789"(ゴールの頂点)への最短経路を探ります。

BFSでの迷路の最短経路探索では、一度通ったマスには通らないようにしないといけません。私の提出したプログラムでは、通ったマスは全部マスのハッシュ値(といっても頂点の数値をそのままintにしたもの)を覚えておいて、それと一致するかを見ています。 HashSet検索なので、検索コストも速いはず。

0-indexedか1-indexedか、ちょっとややこしいです。

最大でも数字の並びは9! = 362880 なので $3 \times 10^{5}$程度のノード数しかないです。

感想

スライドパズルの解法がそのまま使えそうだったのは面白かった。なお、問題では頂点数が最大で9の9スライドパズルでしたが、15スライドパズルになると、頂点数が最大で16! = 20922789888000で頂点数が膨大になり、ナイーブなBFSでは扱えなくなるそうです。調べたところ、こういうスライドパズルでは、A*などのヒューリスティックな探索を用いるとのこと。