module main; // https://sugarknri.hatenablog.com/entry/2016/05/18/235955 より // 15パズル import std; void main() { // 入力 int[] A; foreach (_; 0 .. 4) A ~= readln.split.to!(int[]).map!"--a".array; // 答えの計算と出力 int cnt = 0; foreach (i, j; A) { if (j == -1) continue; // 空きマスはスキップ int d = abs(i.to!int / 4 - j / 4) + abs(i.to!int % 4 - j % 4); // マンハッタン距離が2以上のマスがあれば不可 if (d > 1) { writeln("No"); return; } // マンハッタン距離が1であるマスを数える if (d > 0) cnt++; } int target = -1; // 動かすマス while (target != 15) { int i = 0; while (A[i] != target) i++; // targetのパネルと空きマスを入れ替えたので、パネルが1つ正しい位置に戻った cnt--; // 空きマスはtargetのパネルがあるi番目のマスと入れ替えられるので // 今度はこのマスに本来いるべきパネルを探す target = i; } // 実際には最初に空きマスの位置を探した分で余分に1回decしてしまっているので // 全てのパネルが正しい位置に戻っていればcntは-1になる writeln(cnt == -1 ? "Yes" : "No"); }