#include<iostream> 
using namespace std; 
 
const int MAX=105
int n,flag; 
int visited[MAX],match[MAX],mat[MAX][MAX]; 
 
void init() 

    for(int i=1;i<MAX;i++) 
        for(int j=1;j<MAX;j++) 
        { 
            mat[i][j]=0
        } 
 

 
int path(int u) 

    int i,v; 
    for(v=1;v<=n;v++) 
    { 
        if(!visited[v]&&mat[u][v]) 
        { 
            visited[v]=1
            if(match[v]==-1||path(match[v])) 
            { 
                match[v]=u; 
                return 1
            } 
        } 
    } 
    return 0

 
void max_match() 

    int i,ans=0
    memset(match,-1,sizeof(match)); 
    for(i=1;i<=n;i++) 
    { 
        memset(visited,0,sizeof(visited)); 
        if(!path(i)) 
        { 
            flag=1
            break
        } 
    } 
    return ; 

 
int main(void

    int count,i,j,t,a[MAX],b[MAX],c,m,k; 
    while(scanf("%d",&n)==1
    { 
        flag=0
        memset(a,0,sizeof(a)); 
        memset(b,0,sizeof(b)); 
        init(); 
        for(i=1;i<=n;i++) 
            for(j=1;j<=n;j++) 
                scanf("%d",&mat[i][j]); 
        max_match(); 
 
        c=0
        for(j=1;j<=n;j++) 
        { 
            m=j; 
            for(k=j;k<=n;k++) 
                if(match[k]<match[m]) 
                    m=k; 
            if(m!=j) 
            { 
                a[c]=m; 
                b[c]=j; 
                c++; 
                t=match[m]; 
                match[m]=match[j]; 
                match[j]=t; 
            } 
        } 
        if(flag) 
            printf("-1\n"); 
        else 
        {     
            printf("%d\n",c); 
            for(i=0;i<c;i++) 
                printf("C %d %d\n",a[i],b[i]); 
        } 
    } 

posted on 2011-08-22 16:45  cchun  阅读(252)  评论(0编辑  收藏  举报