結果
問題 |
No.2986 Permutation Puzzle
|
ユーザー |
![]() |
提出日時 | 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