結果
| 問題 | No.228 ゆきこちゃんの 15 パズル |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-20 11:04:22 |
| 言語 | D (dmd 2.112.0) |
| 結果 |
AC
|
| 実行時間 | 1 ms / 5,000 ms |
| コード長 | 1,223 bytes |
| 記録 | |
| コンパイル時間 | 2,136 ms |
| コンパイル使用メモリ | 172,308 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-04-20 11:04:26 |
| 合計ジャッジ時間 | 3,007 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 17 |
ソースコード
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");
}