結果
| 問題 |
No.283 スライドパズルと魔方陣
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 21:39:12 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,569 bytes |
| コンパイル時間 | 355 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 76,800 KB |
| 最終ジャッジ日時 | 2025-06-12 21:43:43 |
| 合計ジャッジ時間 | 6,905 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 WA * 29 |
ソースコード
def generate_magic_square(n):
magic = [[0 for _ in range(n)] for _ in range(n)]
if n % 2 == 1:
i, j = 0, n // 2
for num in range(1, n * n + 1):
magic[i][j] = num
ni, nj = (i - 1) % n, (j + 1) % n
if magic[ni][nj] == 0:
i, j = ni, nj
else:
i = (i + 1) % n
elif n == 2:
return None
else:
return None
return magic
def count_inversions(arr):
inv_count = 0
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if arr[i] > arr[j]:
inv_count += 1
return inv_count
def main():
import sys
input = sys.stdin.read().split()
idx = 0
N = int(input[idx])
idx += 1
initial = []
for _ in range(N):
row = list(map(int, input[idx:idx + N]))
idx += N
initial.append(row)
if N == 2:
print("impossible")
return
try:
target = generate_magic_square(N)
except:
print("impossible")
return
if not target:
print("impossible")
return
s = []
for row in initial:
for num in row:
if num != 0:
s.append(num)
s_sorted = sorted(s)
target_list = []
for row in target:
for num in row:
if num != N * N:
target_list.append(num)
if s_sorted != sorted(target_list):
print("impossible")
return
initial_list = []
for i in range(N):
for j in range(N):
if initial[i][j] != 0:
initial_list.append(initial[i][j])
target_indices = {num: idx for idx, num in enumerate(target_list)}
permutation = []
for num in initial_list:
permutation.append(target_indices[num])
inv_count = count_inversions(permutation)
blank_i, blank_j = -1, -1
for i in range(N):
for j in range(N):
if initial[i][j] == 0:
blank_i, blank_j = i, j
break
if blank_i != -1:
break
blank_row_from_bottom = (N - 1 - blank_i)
solvable = False
if N % 2 == 1:
if inv_count % 2 == 0:
solvable = True
else:
if inv_count % 2 == 1 and blank_row_from_bottom % 2 == 0:
solvable = True
if solvable:
print("possible")
for row in target:
print(' '.join(map(str, row)))
else:
print("impossible")
if __name__ == '__main__':
main()
gew1fw