Cod sursa(job #1361673)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 25 februarie 2015 22:51:25
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
#include<string.h>
#define DIM 15
FILE *f=fopen("copii.in","r"), *g=fopen("copii.out","w");

long int N, a[DIM][DIM], grupa[DIM], SOL=0;
bool ok[DIM][DIM];

void Citire(){
long int i, j, l;
char s[DIM];

    fscanf(f,"%ld\n",&N);
    for(i=1;i<=N;i++){
        fscanf(f,"%s",s); l = strlen(s); if( s[l-1] == '\n' ){ s[l-1]='\0'; l--; }
        for(j=0;j<=N-1;j++) a[i][j+1] = s[j]-'0';
    }
}

bool Verifica( long int nrgrupe ){
long int i, j, gr;

    if( nrgrupe <= 1 ) return 0;

    for(i=1;i<=nrgrupe;i++) for(j=1;j<=nrgrupe;j++) ok[i][j]=0;
    for(i=1;i<=nrgrupe;i++) ok[i][i]=1;

    for(i=1;i<=N;i++) for(j=1;j<=N;j++) if( a[i][j]==1 ) ok[ grupa[i] ][ grupa[j] ]=1;

    for(i=1;i<=nrgrupe;i++) for(j=1;j<=nrgrupe;j++) if( ok[i][j] == 0 ) return 0;
    return 1;

}

void back( long int nr, long int nrgrupe ){
long int i;

    if( nr > N ) { if( Verifica(nrgrupe) == 1 ) SOL++; }
    else{

        for(i=1;i<=nrgrupe;i++){ grupa[nr]=i; back(nr+1,nrgrupe); }
        grupa[nr] = nrgrupe + 1; back(nr+1,nrgrupe+1);

    }

}

int main(){

    Citire();
    back(1,0);
    fprintf(g,"%ld\n",SOL);

return 0;
}