結果
問題 |
No.283 スライドパズルと魔方陣
|
ユーザー |
![]() |
提出日時 | 2025-06-12 16:59:12 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,635 bytes |
コンパイル時間 | 382 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 66,816 KB |
最終ジャッジ日時 | 2025-06-12 16:59:21 |
合計ジャッジ時間 | 6,975 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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()