結果

問題 No.2986 Permutation Puzzle
ユーザー ID 21712ID 21712
提出日時 2024-12-15 12:23:49
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 125 ms / 2,000 ms
コード長 2,468 bytes
コンパイル時間 1,284 ms
コンパイル使用メモリ 81,816 KB
実行使用メモリ 6,824 KB
最終ジャッジ日時 2024-12-15 12:23:54
合計ジャッジ時間 4,562 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,820 KB
testcase_01 AC 2 ms
6,816 KB
testcase_02 AC 2 ms
6,816 KB
testcase_03 AC 93 ms
6,816 KB
testcase_04 AC 2 ms
6,816 KB
testcase_05 AC 2 ms
6,816 KB
testcase_06 AC 2 ms
6,820 KB
testcase_07 AC 2 ms
6,820 KB
testcase_08 AC 2 ms
6,816 KB
testcase_09 AC 4 ms
6,816 KB
testcase_10 AC 2 ms
6,816 KB
testcase_11 AC 2 ms
6,820 KB
testcase_12 AC 11 ms
6,820 KB
testcase_13 AC 2 ms
6,816 KB
testcase_14 AC 3 ms
6,820 KB
testcase_15 AC 6 ms
6,816 KB
testcase_16 AC 2 ms
6,816 KB
testcase_17 AC 3 ms
6,816 KB
testcase_18 AC 24 ms
6,816 KB
testcase_19 AC 2 ms
6,820 KB
testcase_20 AC 5 ms
6,820 KB
testcase_21 AC 3 ms
6,816 KB
testcase_22 AC 2 ms
6,820 KB
testcase_23 AC 7 ms
6,816 KB
testcase_24 AC 122 ms
6,816 KB
testcase_25 AC 73 ms
6,816 KB
testcase_26 AC 75 ms
6,816 KB
testcase_27 AC 18 ms
6,816 KB
testcase_28 AC 91 ms
6,816 KB
testcase_29 AC 37 ms
6,816 KB
testcase_30 AC 91 ms
6,824 KB
testcase_31 AC 73 ms
6,816 KB
testcase_32 AC 7 ms
6,816 KB
testcase_33 AC 84 ms
6,820 KB
testcase_34 AC 74 ms
6,816 KB
testcase_35 AC 60 ms
6,816 KB
testcase_36 AC 4 ms
6,816 KB
testcase_37 AC 14 ms
6,816 KB
testcase_38 AC 93 ms
6,816 KB
testcase_39 AC 41 ms
6,816 KB
testcase_40 AC 2 ms
6,816 KB
testcase_41 AC 62 ms
6,816 KB
testcase_42 AC 67 ms
6,820 KB
testcase_43 AC 125 ms
6,816 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// yukicoder - ProblemID 11672 - writer's solution

#include <iostream>
#include <vector>

using namespace std;

using matrix = vector<vector<int>>;

void reorder_cols_by_col_perm(matrix &s, int x) {
	matrix t = s;
	for (int r = 0; r < s.size(); r++) {
		for (int c = 0; c < s.size(); c++) {
			s[ r ][ t[c][x] ] = t[r][c];
		}
	}
}

void reorder_rows_by_row_perm(matrix &s, int y) {
	matrix t = s;
	for (int r = 0; r < s.size(); r++) {
		for (int c = 0; c < s.size(); c++) {
			s[ t[y][r] ][ c ] = t[r][c];
		}
	}
}

vector<int> select_col(matrix &s, int x) {
	vector<int> v;
	for (int r = 0; r < s.size(); r++) {
		v.push_back(s[r][x]);
	}
	return v;
}

vector<int> select_row(matrix &s, int y) {
	return s[y];
}

bool search(matrix &b, int k, matrix &s, vector<int> &v) {
	if (k == 0) {
		return b == s;
	}
	for (int i = 0; i < b.size()*2; i++) {
		v.push_back(i);
		matrix t = s;
		if (i < b.size()) {
			reorder_cols_by_col_perm(t, i);
		} else {
			reorder_rows_by_row_perm(t, i-b.size());
		}
		if (search(b, k-1, t, v)) {
			return true;
		}
		v.pop_back();
	}
	return false;
}

int cycle(vector<int> &s) {
	vector<int> t(s.size());
	vector<int> w = s;
	for (int cnt = 1; ; cnt++) {
		for (int i = 0; i < s.size(); i++) {
			t[s[i]] = w[i];
		}
		if (s == t) {
			return cnt;
		}
		w = t;
	}
}

vector<int> solve(int n, int k, matrix &a, matrix &b) {
	vector<int> ops;

	search(b, k, a, ops);
	
	vector<int> ans;
	matrix s = a;
	for (auto op : ops) {
		vector<int> perm;
		int z;
		if (op < n) {
			perm = select_col(s, op);
			reorder_cols_by_col_perm(s, op);
			z = op;
		} else {
			perm = select_row(s, op-n);
			reorder_rows_by_row_perm(s, op-n);
			z = op - n;
		}
		z = perm[z];
		vector<int> tmp;
		for (int cnt = cycle(perm) - 1; cnt > 0; cnt--) {
			if (op < n) {
				tmp.push_back(z);
			} else {
				tmp.push_back(z+n);
			}
			z = perm[z];
		}
		ans.insert(ans.begin(), tmp.begin(), tmp.end());
	}
	
	return ans;
}

int main() {
	int n, k;
	matrix a, b;
	cin >> n >> k;
	a.resize(n);
	for (int r = 0; r < n; r++) {
		a[r].resize(n);
		for (int c = 0; c < n; c++) {
			cin >> a[r][c];
			a[r][c]--;
		}
	}
	b.resize(n);
	for (int r = 0; r < n; r++) {
		b[r].resize(n);
		for (int c = 0; c < n; c++) {
			cin >> b[r][c];
			b[r][c]--;
		}
	}
	
	auto ans = solve(n, k, a, b);
	
	cout << ans.size() << '\n';
	for (auto op : ans) {
		if (op < n) {
			cout << "C " << (op+1) << '\n';
		} else {
			cout << "R " << (op+1-n) << '\n';
		}
	}
	
	return 0;
}
0