思路:
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
const int maxn = 1e2 + 5;
bool vis[maxn];
int mp[maxn][maxn], match[maxn];
int n;
pair<int, int> pai[maxn * 2];
bool dfs(int u){
for(int i = 1; i <= n; i++){
int v = i;
if(!mp[u][v] || vis[v]) continue;
vis[v] = true;
if(!match[v] || dfs(match[v])){
match[v] = u;
return true;
}
}
return false;
}
int main(){
while(~scanf("%d", &n)){
for(int i = 1; i <= n; i++) match[i] = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &mp[i][j]);
int cot = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++) vis[j] = false;
if(dfs(i)) cot++;
}
if(cot < n) printf("-1\n");
else {
// int opt = 0;
// for(int i = 1; i <= n; i++) if(match[i] != i) opt++;
// printf("%d\n", --opt);
// for(int i = 1; i < n; i++){
// for(int j = i + 1; j <= n; j++)
// if(i == match[j]) {
// swap(match[i], match[j]);
// printf("C %d %d\n", i, j);
// }
// }
int opt = 0; //注意:opt这里是个坑点,不能像上面那么计算,
for(int i = 1; i <= n; i++){ //因为当有多个match[i]和matcch[j]
//恰好互补时,上面的计算就是错的
while(match[i] != i){
pai[++opt].first = i;
pai[opt].second = match[i];
swap(match[i], match[match[i]]);
}
}
printf("%d\n", opt);
for(int i = 1; i <= opt; i++) printf("C %d %d\n", pai[i].first, pai[i].second);
}
}
}