Swap

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 459    Accepted Submission(s): 129
Special Judge


Problem Description
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
 

Source
 

Recommend
gaojie
 
 
#include<stdio.h>
#include
<string.h>
const int MAXN=105;
int uN,vN; //u,v数目
int g[MAXN][MAXN];//编号是0~n-1的
int linker[MAXN];
bool used[MAXN];
int a[10000],b[10000];
bool dfs(int u)
{
int v;
for(v=1;v<=vN;v++)
if(g[u][v]&&!used[v])
{
used[v]
=true;
if(linker[v]==-1||dfs(linker[v]))
{
linker[v]
=u;
return true;
}
}
return false;
}
int hungary()
{
int res=0;
int u;
memset(linker,
-1,sizeof(linker));
for(u=1;u<=uN;u++)
{
memset(used,
0,sizeof(used));
if(dfs(u)) res++;
}
return res;
}
int main()
{
int N;
int i,j,u,v;
while(scanf("%d",&N)!=EOF)
{
uN
=vN=N;
for(i=1;i<=uN;i++)
for(j=1;j<=vN;j++)
scanf(
"%d",&g[i][j]);
int ans=hungary();
//printf("%d\n",ans);
if(ans<N){printf("-1\n");continue;}
int res=0;
for(i=1;i<=uN;i++)
{
for(j=i;j<=vN;j++)
if(linker[j]==i) break;
if(j!=i)
{
a[res]
=i;b[res++]=j;
int t=linker[i];linker[i]=linker[j];linker[j]=t;
}
}
printf(
"%d\n",res);
for(i=0;i<res;i++)
printf(
"C %d %d\n",a[i],b[i]);


}
return 0;
}