結果
| 問題 |
No.228 ゆきこちゃんの 15 パズル
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-15 23:42:18 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,716 bytes |
| コンパイル時間 | 215 ms |
| コンパイル使用メモリ | 81,872 KB |
| 実行使用メモリ | 53,620 KB |
| 最終ジャッジ日時 | 2025-04-15 23:44:10 |
| 合計ジャッジ時間 | 1,550 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 16 WA * 1 |
ソースコード
def main():
import sys
input = sys.stdin.read().split()
target = [list(map(int, input[i*4:(i+1)*4])) for i in range(4)]
# Check normal 15-puzzle solvability
# Compute inversion count (excluding 0)
flat = []
blank_row = -1
for i in range(4):
for j in range(4):
val = target[i][j]
if val == 0:
blank_row = 3 - i # row from bottom (0-based)
else:
flat.append(val)
inv_count = 0
for i in range(len(flat)):
for j in range(i+1, len(flat)):
if flat[i] > flat[j]:
inv_count += 1
# For solvable, inv_count + blank_row must be even
if (inv_count + blank_row) % 2 != 0:
print("No")
return
# Check Manhattan distance for each tile (0 is excluded)
# Initial positions (standard 15 puzzle)
initial_pos = {}
for i in range(4):
for j in range(4):
val = i * 4 + j + 1
if val == 16:
initial_pos[0] = (i, j)
else:
initial_pos[val] = (i, j)
possible = True
for i in range(4):
for j in range(4):
val = target[i][j]
if val == 0:
continue
# Find target position (i, j)
# Find initial position of val
initial_i, initial_j = initial_pos[val]
# Manhattan distance
dx = abs(i - initial_i)
dy = abs(j - initial_j)
if dx + dy > 1:
possible = False
break
if not possible:
break
print("Yes" if possible else "No")
if __name__ == "__main__":
main()
lam6er