結果
| 問題 | No.2986 Permutation Puzzle |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-01 13:49:28 |
| 言語 | PyPy3 (7.3.23 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 1,003 ms / 2,000 ms |
| + 114µs | |
| コード長 | 3,331 bytes |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
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)