Cod sursa(job #2087071)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 12 decembrie 2017 21:11:47
Problema Copii Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<stdio.h>
#include<string.h>
#define MAXN 10
bool verif();
void bkt(int lev);
FILE*fin,*fout;
int N,maxmult=0;
long long ans=0;
int sol[MAXN+1];
bool adiac[MAXN+1][MAXN+1];
bool gasit[MAXN+1][MAXN+1];
int main()
{
    fin=fopen("copii.in","r");
    fout=fopen("copii.out","w");
    fscanf(fin,"%d",&N);
    fgetc(fin);
    char buf[MAXN+1];
    for(int i=1; i<=N; i++)
    {
        fgets(buf,MAXN+1,fin);
        for(int j=0; j<N; j++)
        {
            adiac[i][j+1]=buf[j]-'0';
        }
    }
    bkt(1);
    fprintf(fout,"%lld",ans);
    fclose(fin);
    fclose(fout);
}
void bkt(int lev)
{
    if(lev==N+1)
    {
        //print_sol();
        if(verif())
        {
            ans++;
        }
    }
    else
    {
        for(int i=1; i<=maxmult; i++)
        {
            sol[lev]=i;
            bkt(lev+1);
        }
        maxmult++;
        sol[lev]=maxmult;
        bkt(lev+1);
        maxmult--;
    }
}
bool verif()
{
    if(maxmult<2)
    {
        return 0;
    }
    for(int i=1; i<=MAXN; i++)
    {
        for(int j=1; j<=MAXN; j++)
        {
            gasit[i][j]=0;
        }
    }
    for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=N; j++)
        {
            if(adiac[i][j])
            {
                gasit[sol[i]][sol[j]]=1;
            }
        }
    }
    for(int i=1; i<=maxmult; i++)
    {
        for(int j=1; j<=maxmult; j++)
        {
            if(!gasit[i][j] && i!=j)
            {
                return 0;
            }
        }
    }
    return 1;
}