Swap
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3830 Accepted Submission(s): 1411
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
#include<iostream>
#include<cstring>
using namespace std;
int mapp[108][108];
int mask[108];
int mx[108];
int my[108];
int L,R;
int findpath(int u){
for(int i=1;i<=R;i++)
{
if(!mask[i] && mapp[u][i]==1)
{
mask[i]=1;
if(my[i]==-1 || findpath(my[i]))
{
mx[u]=i;
my[i]=u;
return 1;
}
}
}
return 0;
}
int maxMatch(){
memset(mx,-1,sizeof(mx));
memset(my,-1,sizeof(my));
int res(0);
for(int i=1;i<=L;i++)
{
if(mx[i]==-1)
{
memset(mask,0,sizeof(mask));
if(findpath(i)==1)
{
res++;
}
}
}
return res;
}
int main(){
int N;
while(cin>>N && N!=EOF)
{
int count=0;
int xmap[1008]={0},ymap[1008]={0};
memset(mapp,0,sizeof(mapp));
//input & init
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
cin>>mapp[i][j];
}
}
L=N;R=N;
//二分图 最大匹配
if(N!=maxMatch())
{
cout<<-1<<endl;
}
else
{
//交换 !!
for(int i=1;i<=L;i++)
{
if(i!=mx[i])
{
int x=mx[i];
int y=my[i];
mx[i]=i;
my[i]=i;
mx[y]=x;
my[x]=y;
xmap[count]=i;
ymap[count++]=y;
}
}
//output
cout<<count<<endl;
for(int i=0;i<count;i++)
{
cout<<"R"<<" "<<xmap[i]<<" "<<ymap[i]<<endl;
}
}
}
return 0;
}