Swap

xiaoxiao2021-02-28  27

Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. Can you find a way to make all the diagonal entries equal to 1?

Input

There are several test cases in the input. The first line of each test case is an integer N (1 <= N <= 100). Then N lines follow, each contains N numbers (0 or 1), separating by space, indicating the N*N matrix.

Output

For each test case, the first line contain the number of swaps M. Then M lines follow, whose format is “R a b” or “C a b”, indicating swapping the row a and row b, or swapping the column a and column b. (1 <= a, b <= N). Any correct answer will be accepted, but M should be more than 1000. If it is impossible to make all the diagonal entries equal to 1, output only one one containing “-1”.

Sample Input

2 0 1 1 0 2 1 0 1 0

Sample Output

1 R 1 2 -1 #include<bits/stdc++.h> using namespace std; const int M=110; int n,m[M],f[M],vis[M]; int g[M][M],ans[M][2]; bool dfs(int x){ int i; for(i=1;i<=n;i++) if(g[x][i]&&vis[i]==0){ vis[i]=1; if(m[i]==0||dfs(m[i])){ m[i]=x; return 1; } } return 0; } int main(){ int l,s,i,j,k; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&g[i][j]); memset(m,0,sizeof(m)); s=0; for(i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); if(dfs(i))s++; } if(s<n)printf("-1\n"); else{ l=0; for(i=1;i<=n;i++) f[i]=i; for(i=1;i<=n;i++) if(m[i]!=f[i]){ for(j=i+1;j<=n;j++) if(m[i]==f[j]) break; l++; ans[l][0]=i; ans[l][1]=j; f[j]=f[i]; } printf("%d\n",l); for(i=1;i<=l;i++) printf("R %d %d\n",ans[i][0],ans[i][1]); } } }
转载请注明原文地址: https://www.6miu.com/read-2613765.html

最新回复(0)