結果
| 問題 |
No.2986 Permutation Puzzle
|
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 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)));
}
}
ID 21712