結果

問題 No.283 スライドパズルと魔方陣
ユーザー maspymaspy
提出日時 2020-05-03 16:01:16
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
WA  
実行時間 -
コード長 3,268 bytes
コンパイル時間 168 ms
コンパイル使用メモリ 13,312 KB
実行使用メモリ 45,068 KB
最終ジャッジ日時 2024-06-12 20:05:42
合計ジャッジ時間 20,656 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 423 ms
44,804 KB
testcase_01 AC 433 ms
44,804 KB
testcase_02 AC 422 ms
44,424 KB
testcase_03 WA -
testcase_04 AC 439 ms
44,804 KB
testcase_05 AC 423 ms
44,804 KB
testcase_06 AC 422 ms
44,556 KB
testcase_07 AC 424 ms
44,552 KB
testcase_08 AC 437 ms
44,672 KB
testcase_09 AC 421 ms
44,424 KB
testcase_10 AC 425 ms
44,548 KB
testcase_11 AC 420 ms
44,420 KB
testcase_12 AC 421 ms
44,808 KB
testcase_13 AC 421 ms
44,420 KB
testcase_14 AC 437 ms
44,556 KB
testcase_15 AC 421 ms
44,676 KB
testcase_16 AC 425 ms
44,800 KB
testcase_17 AC 426 ms
44,552 KB
testcase_18 AC 424 ms
44,552 KB
testcase_19 AC 422 ms
45,060 KB
testcase_20 AC 426 ms
44,800 KB
testcase_21 AC 428 ms
44,656 KB
testcase_22 AC 426 ms
44,932 KB
testcase_23 AC 423 ms
44,556 KB
testcase_24 AC 436 ms
44,428 KB
testcase_25 AC 428 ms
44,936 KB
testcase_26 AC 434 ms
44,860 KB
testcase_27 AC 447 ms
45,056 KB
testcase_28 AC 450 ms
44,552 KB
testcase_29 AC 455 ms
44,808 KB
testcase_30 AC 453 ms
44,676 KB
testcase_31 AC 443 ms
44,672 KB
testcase_32 AC 448 ms
44,808 KB
testcase_33 AC 457 ms
44,800 KB
testcase_34 AC 455 ms
44,928 KB
testcase_35 AC 457 ms
44,808 KB
testcase_36 AC 451 ms
44,808 KB
testcase_37 AC 455 ms
44,420 KB
testcase_38 AC 452 ms
44,548 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
import numpy as np

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines

def f(N):
    if N % 4 == 0:
        return f0(N)
    elif N % 4 == 2:
        return f2(N)
    else:
        return f13(N)


def f13(N):
    A = np.zeros((N, N), np.int32)
    x = 0
    y = N // 2
    for i in range(1, N * N + 1):
        if A[x][y]:
            x += 2
            y -= 1
            x %= N
            y %= N
        A[x, y] = i
        x -= 1
        y += 1
        x %= N
        y %= N
    return A


def f0(N):
    A = np.arange(N * N).reshape(N, N)

    A[1::4, 0::4] *= -1
    A[1::4, 3::4] *= -1
    A[2::4, 0::4] *= -1
    A[2::4, 3::4] *= -1
    A[0::4, 1::4] *= -1
    A[0::4, 2::4] *= -1
    A[3::4, 1::4] *= -1
    A[3::4, 2::4] *= -1
    A[A < 0] += N * N - 1
    A += 1
    return A


def f2(N):
    A = f(N // 2)
    A = np.repeat(A, 2, axis=0).repeat(2, axis=1)
    A = (A - 1) * 4
    n = N // 4
    # L-type
    A[:2 * n + 2:2, ::2] += 4
    A[:2 * n + 2:2, 1::2] += 1
    A[1:2 * n + 2:2, ::2] += 2
    A[1:2 * n + 2:2, 1::2] += 3
    # U-type
    A[2 * n + 2, ::2] += 1
    A[2 * n + 2, 1::2] += 4
    A[2 * n + 3, ::2] += 2
    A[2 * n + 3, 1::2] += 3
    # X-type
    A[2 * n + 4::2, ::2] += 1
    A[2 * n + 4::2, 1::2] += 4
    A[2 * n + 5::2, ::2] += 3
    A[2 * n + 5::2, 1::2] += 2
    # modify center
    A[2 * n, 2 * n] -= 3
    A[2 * n, 2 * n + 1] += 3
    A[2 * n + 2, 2 * n] += 3
    A[2 * n + 2, 2 * n + 1] -= 3
    return A

N = int(readline())
A = np.array(read().split()).reshape(N, N).astype(np.int32)

def check(A, B):
    N = A.shape[0]
    A = A.ravel()
    B = B.ravel()
    Ax, Ay = np.divmod(np.argmax(A), N)
    Bx, By = np.divmod(np.argmax(B), N)
    pos_A = np.empty_like(A)
    pos_A[A] = np.arange(N * N)
    B = pos_A[B]
    inv = 0
    for i, x in enumerate(B):
        inv += np.sum(B[:i] > x)
    dist = abs(Ax - Bx) + abs(Ay - By)
    return (inv - dist) % 2 == 0

def solve(A):
    N = A.shape[0]
    if N == 1:
        return A
    if N == 2:
        return None
    if N == 3:
        B = f(N) - 1
        if check(A, B):
            return B
        else:
            # おーい、対角線要求されてないんだが
            return np.array([3, 5, 7, 8, 1, 6, 4, 9, 2]).reshape(3, 3) - 1
    if N % 2 == 0:
        B = f(N) - 1
        if check(A, B):
            return B
        else:
            return B[::-1]
    if N % 3 != 0:
        # 完全方陣
        x = np.arange(N)
        B0 = np.add.outer(x, 2 * x) % N
        B1 = B0.T
        B = N * B0 + B1
        if check(A, B):
            return B
        return np.roll(B, 1, axis=0)
    # N は 3 の倍数
    M = N // 3
    C = (f(M) - 1) * 9
    D = f(3) - 1
    B = np.empty_like(A)
    for i in range(3):
        for j in range(3):
            B[i::3, j::3] = C + D[i, j]
    if check(A, B):
        return B
    x, y = divmod(np.argmax(C), M)
    temp = B[3 * x, 3 * y:3 * y + 3].copy()
    B[3 * x, 3 * y:3 * y + 3] = B[3 * x + 2, 3 * y:3 * y + 3]
    B[3 * x + 2, 3 * y:3 * y + 3] = temp
    return B

A[A == 0] = N * N
A -= 1
B = solve(A)
if B is None:
    print('impossible')
else:
    print('possible')
    B += 1
    print('\n'.join(' '.join(row) for row in B.astype(str)))
0