結果
| 問題 |
No.283 スライドパズルと魔方陣
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 21:39:17 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,635 bytes |
| コンパイル時間 | 144 ms |
| コンパイル使用メモリ | 82,480 KB |
| 実行使用メモリ | 66,916 KB |
| 最終ジャッジ日時 | 2025-06-12 21:43:44 |
| 合計ジャッジ時間 | 5,218 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 6 WA * 33 |
ソースコード
def generate_magic_square_odd(n):
magic = [[0 for _ in range(n)] for _ in range(n)]
i, j = 0, n // 2
num = 1
while num <= n * n:
magic[i][j] = num
num += 1
ni, nj = i - 1, j + 1
if ni < 0:
ni = n - 1
if nj >= n:
nj = 0
if magic[ni][nj] != 0:
ni, nj = i + 1, j
i, j = ni, nj
return magic
def generate_magic_square_4():
return [
[16, 3, 2, 13],
[5, 10, 11, 8],
[9, 6, 7, 12],
[4, 15, 14, 1]
]
def is_magic_square(grid):
n = len(grid)
magic_sum = n * (n**2 + 1) // 2
for row in grid:
if sum(row) != magic_sum:
return False
for j in range(n):
col_sum = 0
for i in range(n):
col_sum += grid[i][j]
if col_sum != magic_sum:
return False
diag1 = sum(grid[i][i] for i in range(n))
diag2 = sum(grid[i][n - 1 - i] for i in range(n))
if diag1 != magic_sum or diag2 != magic_sum:
return False
return True
def main():
import sys
input = sys.stdin.read().split()
idx = 0
N = int(input[idx])
idx +=1
grid = []
for _ in range(N):
row = list(map(int, input[idx:idx+N]))
grid.append(row)
idx += N
if N == 2:
print("impossible")
return
if N % 2 == 1:
B = generate_magic_square_odd(N)
elif N == 4:
B = generate_magic_square_4()
else:
print("impossible")
return
A = [row[:] for row in grid]
for i in range(N):
for j in range(N):
if A[i][j] == 0:
A[i][j] = N * N
if is_magic_square(A):
print("possible")
for row in A:
print(' '.join(map(str, row)))
return
flat_A = [num for row in A for num in row]
flat_B = [num for row in B for num in row]
value_to_index = {val: idx for idx, val in enumerate(flat_A)}
P = [value_to_index[val] for val in flat_B]
inversions = 0
n = len(P)
for i in range(n):
for j in range(i + 1, n):
if P[i] > P[j]:
inversions += 1
blank_i, blank_j = -1, -1
for i in range(N):
for j in range(N):
if grid[i][j] == 0:
blank_i, blank_j = i, j
break
if blank_i != -1:
break
if (inversions + (N - 1 - blank_i)) % 2 == 0:
print("possible")
for row in B:
print(' '.join(map(str, row)))
else:
print("impossible")
if __name__ == "__main__":
main()
gew1fw