結果

問題 No.2986 Permutation Puzzle
コンテスト
ユーザー flippergo
提出日時 2026-09-01 13:49:28
言語 PyPy3
(7.3.23 + ACL)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 1,003 ms / 2,000 ms
+ 114µs
コード長 3,331 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 242 ms
コンパイル使用メモリ 96,464 KB
実行使用メモリ 89,992 KB
最終ジャッジ日時 2026-09-01 13:49:47
合計ジャッジ時間 15,996 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 40
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

N,K = map(int,input().split())
A = [list(map(int,input().split())) for _ in range(N)]
A = [[A[i][j]-1 for j in range(N)] for i in range(N)]
B = [list(map(int,input().split())) for _ in range(N)]
B = [[B[i][j]-1 for j in range(N)] for i in range(N)]
def inv_b(b):
    c = [(b[i],i) for i in range(N)]
    c = sorted(c,key=lambda x:x[0])
    c = [c[i][1] for i in range(N)]
    return c
def row_tr(b,D):
    C = [[0 for _ in range(N)] for _ in range(N)]
    for k in range(N):
        for j1 in range(N):
            C[b[k]][j1] = D[k][j1]
    return C
def col_tr(b,D):
    C = [[0 for _ in range(N)] for _ in range(N)]
    for k in range(N):
        for i1 in range(N):
            C[i1][b[k]] = D[i1][k]
    return C
ans = []
def dfs(x,i,A):
    flag = True
    for i in range(N):
        for j in range(N):
            if A[i][j]!=B[i][j]:
                flag = False
                break
        if not flag:break
    if flag:
        return flag
    if len(ans)==K:
        return flag
    for y in ["R","C"]:
        for j in range(N):
            if y=="R":
                b = [0]*N
                for k in range(N):
                    b[k] = A[j][k]
                A = row_tr(b,A)
            else:
                b = [0]*N
                for k in range(N):
                    b[k] = A[k][j]
                A = col_tr(b,A)
            ans.append((y,j,b))
            flag = dfs(y,j,A)
            if flag:
                return flag
            if y=="R":
                A = row_tr(inv_b(b),A)
            else:
                A = col_tr(inv_b(b),A)
            ans.pop()
    return False
flag = False
for x in ["R","C"]:
    for i in range(N):
        if x=="R":
            b = [0]*N
            for k in range(N):
                b[k] = A[i][k]
            A = row_tr(b,A)
        else:
            b = [0]*N
            for k in range(N):
                b[k] = A[k][i]
            A = col_tr(b,A)
        ans.append((x,i,b))
        flag = dfs(x,i,A)
        if flag:break
        if x=="R":
            A = row_tr(inv_b(b),A)
        else:
            A = col_tr(inv_b(b),A)
        ans.pop()
    if flag:break
ans = ans[::-1]
sol = []
for x,i,b in ans:
    if x=="R":
        c = b[:]
        e = list(range(N))
        k = 1
        while e!=c:
            for j in range(N):
                c[j] = b[c[j]]
            k += 1
        ind = 0
        for i1 in range(N):
            flag = True
            for j1 in range(N):
                if b[j1]==B[i1][j1]:continue
                flag = False
                break
            if flag:
                ind = i1
                break
        for _ in range(k-1):
            B = row_tr(b,B)
            sol.append((x,ind))
            ind = b[ind]
    else:
        c = b[:]
        e = list(range(N))
        k = 1
        while c!=e:
            for j in range(N):
                c[j] = b[c[j]]
            k += 1
        for j1 in range(N):
            flag = True
            for i1 in range(N):
                if b[i1]==B[i1][j1]:
                    continue
                flag = False
                break
            if flag:
                ind = j1
                break
        for _ in range(k-1):
            B = col_tr(b,B)
            sol.append((x,ind))
            ind = b[ind]
print(len(sol))
for x,i in sol:
    print(x,i+1)
0