結果
| 問題 |
No.2986 Permutation Puzzle
|
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2025-02-19 01:11:26 |
| 言語 | Kuin (KuinC++ v.2021.9.17) |
| 結果 |
AC
|
| 実行時間 | 208 ms / 2,000 ms |
| コード長 | 2,393 bytes |
| コンパイル時間 | 3,444 ms |
| コンパイル使用メモリ | 163,624 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2025-02-19 01:11:34 |
| 合計ジャッジ時間 | 7,195 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
func reorderColsByColPerm(s: [][]int, x: int): [][]int
var t : [][]int :: ##s
for r(0,^s-1)
for c(0,^s-1)
do t[ r ][ s[c][x] ] :: s[r][c]
end for
end for
ret t
end func
func reorderRowsByRowPerm(s: [][]int, y: int): [][]int
var t: [][]int :: ##s
for r(0,^s-1)
for c(0,^s-1)
do t[ s[y][r] ][ c ] :: s[r][c]
end for
end for
ret t
end func
func isSame(a: [][]int, b: [][]int): bool
for r(0,^a-1)
for c(0,^a-1)
if(a[r][c]<>b[r][c])
ret false
end if
end for
end for
ret true
end func
func search(b: [][]int, k: int, s: [][]int, v: []int): bool
if(k=0)
ret @isSame(b,s)
end if
for op(0,^b*2-1)
var t: [][]int :: (op<^b) ?(@reorderColsByColPerm(s,op),@reorderRowsByRowPerm(s,op-^b))
do v[^v-k] :: op
if(search(b,k-1,t,v))
ret true
end if
end for
ret false
end func
func selectCol(s: [][]int, x: int): []int
var p: []int :: #[^s]int
for r(0,^s-1)
do p[r] :: s[r][x]
end for
ret p
end func
func selectRow(s: [][]int, y: int): []int
var p: []int :: #[^s]int
for c(0,^s-1)
do p[c] :: s[y][c]
end for
ret p
end func
func solve(n: int, k: int, a: [][]int, b: [][]int): []int
var ops: []int :: #[k]int
do @search(b,k,a,ops)
var ans: []int :: #[0]int
for i(0,^ops-1)
var op: int :: ops[i]
var p: []int :: (op<n) ?(@selectCol(a,op),@selectRow(a,op-n))
if(op<n)
do a :: @reorderColsByColPerm(a,op)
else
do a :: @reorderRowsByRowPerm(a,op-n)
end if
var tmp: list<int> :: #list<int>
var w: []int :: ##p
var t: []int :: #[n]int
var z: int :: op%n
while loop(true)
for j(0,n-1)
do t[p[j]] :: w[j]
end for
var ok: bool :: true
for j(0,n-1)
do ok :: ok & t[j]=p[j]
end for
if(ok)
break loop
end if
do z :: p[z]
do tmp.add(z+op/n*n)
do w :: ##t
end while
do ans :: tmp.toArray() ~ ans
end for
ret ans
end func
func readMat(n: int): [][]int
var mat: [][]int :: #[n,n]int
for r(0,n-1)
for c(0,n-1)
do mat[r][c] :: cui@inputInt()-1
end for
end for
ret mat
end func
func main()
var n: int :: cui@inputInt()
var k: int :: cui@inputInt()
var a: [][]int :: @readMat(n)
var b: [][]int :: @readMat(n)
var ans: []int :: @solve(n,k,a,b)
do cui@print((^ans).toStr() ~ "\n")
for i(0,^ans-1)
var op: int :: (ans[i]%n)+1
if(ans[i]<n)
do cui@print("C " ~ op.toStr() ~ "\n")
else
do cui@print("R " ~ op.toStr() ~ "\n")
end if
end for
end func
ID 21712