Cod sursa(job #1553713)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 20 decembrie 2015 13:46:21
Problema Copii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <cstdio>
#define MAXN 10
int mat[MAXN+1][MAXN+1],v[MAXN+1],vf[MAXN+1][MAXN+1],ind[MAXN+1],next[MAXN+1];
int con,n;
void bkt(int k,int g){
    int i,nr,flag,aux1,aux2,poz,j;
    if(k==n+1){
        flag=1;
        for(i=1;i<=g&&flag==1;i++){
            poz=ind[i];
            nr=0;
            while(poz){
                for(j=1;j<=n;j++)
                  if(poz!=j&&mat[poz][j]==1&&vf[i][v[j]]==0&&i!=v[j]){
                      vf[i][v[j]]=1;
                      nr++;
                  }
                poz=next[poz];
            }
            if(nr<g-1)
                flag=0;
        }
        for(i=1;i<=g;i++)
            for(j=1;j<=g;j++)
                vf[i][j]=0;
        if(g==1)
            flag=0;
        con+=flag;
    }
    else
        for(i=1;i<=g+1;i++){
            aux1=next[k];
            aux2=ind[i];
            v[k]=i;
            next[k]=ind[i];
            ind[i]=k;
            if(i==g+1)
                bkt(k+1,i);
            else
                bkt(k+1,g);
            next[k]=aux1;
            ind[i]=aux2;
        }
}
int main(){
    FILE*fi,*fout;
    int i,j;
    char a;
    fi=fopen("copii.in" ,"r");
    fout=fopen("copii.out" ,"w");
    fscanf(fi,"%d" ,&n);
    a=fgetc(fi);
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++)
            mat[i][j]=fgetc(fi)-'0';
        a=fgetc(fi);
    }
    bkt(1,0);
    fprintf(fout,"%d" ,con);
    fclose(fi);
    fclose(fout);
    return 0;
}