結果
問題 | No.2986 Permutation Puzzle |
ユーザー |
![]() |
提出日時 | 2024-12-20 20:33:52 |
言語 | C# (.NET 8.0.404) |
結果 |
AC
|
実行時間 | 614 ms / 2,000 ms |
コード長 | 3,415 bytes |
コンパイル時間 | 8,093 ms |
コンパイル使用メモリ | 167,664 KB |
実行使用メモリ | 214,236 KB |
最終ジャッジ日時 | 2024-12-20 20:34:12 |
合計ジャッジ時間 | 17,929 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 40 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (127 ms)。 MSBuild のバージョン 17.9.6+a4ecab324 (.NET) main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
using System;using System.Collections.Generic;using System.Linq;public class Solver{static List<int> Solve(int n, int k, int[,] a, int[,] b){var ops = new List<int>();Search(b, k, a, ops);ops.Reverse();var ans = new List<int>();var s = (int[,])a.Clone();foreach (var op in ops){List<int> p;if (op < n){p = SelectCol(s, op);ReorderColsByColPerm(s, op);}else{p = SelectRow(s, op-n);ReorderRowsByRowPerm(s, op-n);}var z = op%n;var tmp = new List<int>();for (var cnt = cycle(p)-1; cnt > 0; cnt--){z = p[z];tmp.Add(op < n ? z : (z+n));}ans = tmp.Concat(ans).ToList();}return ans;}static bool Search(int[,] b, int k, int[,] t, List<int> v){if (k == 0){return IsSame(b, t);}for (var i = 0; i <= b.GetUpperBound(0); i++){v.Insert(0, i);var s = (int[,])t.Clone();ReorderColsByColPerm(s, i);if (Search(b, k-1, s, v)) {return true;}v[0] += b.GetUpperBound(0)+1;s = (int[,])t.Clone();ReorderRowsByRowPerm(s, i);if (Search(b, k-1, s, v)) {return true;}v.RemoveAt(0);}return false;}static int cycle(List<int> p){var t = new int[p.Count];var w = p.ToArray();for (var cnt = 1; ; cnt++){for (var i = 0; i < p.Count; i++){t[p[i]] = w[i];}var ok = true;for (var i = 0; i < p.Count; i++){if (t[i] != p[i]){ok = false;}}if (ok){return cnt;}var tmp = t; t = w; w = tmp;}}static void ReorderColsByColPerm(int[,] s, int x){var p = SelectCol(s, x);var t = (int[,])s.Clone();for (var r = 0; r <= s.GetUpperBound(0); r++){for (var c = 0; c <= s.GetUpperBound(1); c++){s[ r, t[c, x] ] = t[r, c];}}}static void ReorderRowsByRowPerm(int[,] s, int y){var p = SelectRow(s, y);var t = (int[,])s.Clone();for (var r = 0; r <= s.GetUpperBound(0); r++){for (var c = 0; c <= s.GetUpperBound(1); c++){s[ t[y, r], c ] = t[r, c];}}}static List<int> SelectCol(int[,] s, int x){var v = new List<int>();for (var r = 0; r <= s.GetUpperBound(0); r++){v.Add(s[r,x]);}return v;}static List<int> SelectRow(int[,] s, int y){var v = new List<int>();for (var c = 0; c <= s.GetUpperBound(1); c++){v.Add(s[y,c]);}return v;}static bool IsSame(int[,] s, int[,] t){for (var r = 0; r <= s.GetUpperBound(0); r++){for (var c = 0; c <= s.GetUpperBound(1); c++){if (s[r,c] != t[r,c]){return false;}}}return true;}public static void Main(){var input = ReadAll();var n = input.Dequeue();var k = input.Dequeue();var a = new int[n,n];var b = new int[n,n];for (var r = 0; r < n; r++){for (var c = 0; c < n; c++){a[r,c] = input.Dequeue() - 1;}}for (var r = 0; r < n; r++){for (var c = 0; c < n; c++){b[r,c] = input.Dequeue() - 1;}}var ans = Solve(n, k, a, b);Console.Out.WriteLine(ans.Count);foreach (var op in ans){if (op < n){Console.Out.WriteLine("C {0}", op+1);}else{Console.Out.WriteLine("R {0}", op+1-n);}}}static Queue<int> ReadAll(){return new Queue<int>(Console.In.ReadToEnd().Trim().Split(null).Select(s => Convert.ToInt32(s)));}}