Cod sursa(job #1383105)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 9 martie 2015 21:32:58
Problema Copii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#define MAXN 10
int n, d[MAXN], v[MAXN], t[MAXN], p[MAXN], ans;
inline int check(int max){
    int f=(max>1), i, j;
    for(i=0; i<max; i++){
        p[i]=d[i]=0;
    }
    for(i=0; i<n; i++){
        p[v[i]]|=t[i];
        d[v[i]]|=1<<i;
    }
    i=0;
    while((f==1)&&(i<max)){
        j=0;
        while((j<max)&&(f==1)){
            if((p[i]&d[j])==0){
                f=0;
            }
            j++;
        }
        i++;
    }
    return f;
}
void partit(int k, int max){
    int i;
    if(k==n){
        ans+=check(max);
        return ;
    }
    for(i=0; i<max; i++){
        v[k]=i;
        partit(k+1, max);
    }
    v[k]=max;
    partit(k+1, max+1);
}
int main(){
    int i, j;
    char ch;
    FILE *fin, *fout;
    fin=fopen("copii.in", "r");
    fout=fopen("copii.out", "w");
    fscanf(fin, "%d ", &n);
    for(i=0; i<n; i++){
        t[i]=1<<i;
        for(j=0; j<n; j++){
            ch=fgetc(fin);
            if(ch=='1'){
                t[i]|=1<<j;
            }
        }
        fgetc(fin);
    }
    partit(0, 0);
    fprintf(fout, "%d\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}