Cod sursa(job #1786683)

Utilizator nnnmmmcioltan alex nnnmmm Data 23 octombrie 2016 14:36:09
Problema Copii Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<cstdio>

const int NMAX=10;
char v[NMAX+1][NMAX+2];
int multime[NMAX+1],nr_multime=0;
bool se_poate[NMAX+1][NMAX+1];
int n,rasp=0;

void back(int k)
{
 if(k==n+1)
    {
     if(nr_multime<2)
        return;
     for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
             se_poate[i][j]=false;
     for(int i=1;i<=n;i++)
         {
          for(int j=1;j<=n;j++)
              if(v[i][j]=='1' && multime[j]!=multime[i])
                 se_poate[multime[i]][multime[j]]=true;
         }
     for(int i=1;i<=nr_multime;i++)
         {
          se_poate[i][0]=true;
          for(int j=1;j<=nr_multime;j++)
              if(!se_poate[i][j] && j!=i)
                 se_poate[i][0]=false;
         }
     bool _se_poate=true;
     for(int i=1;i<=nr_multime && _se_poate;i++)
         if(!se_poate[i][0])
            _se_poate=false;
     if(_se_poate)
        rasp++;
    }
 else
    {
     for(int i=1;i<=nr_multime;i++)
         {
          multime[k]=i;
          back(k+1);
         }
     multime[k]=nr_multime+1;
     nr_multime++;
     back(k+1);
     nr_multime--;
    }
}
int main()
{
 FILE *in=fopen("copii.in","r");
 fscanf(in,"%d ",&n);
 for(int i=1;i<=n;i++)
     {
      fscanf(in,"%s ",v[i]+1);
     }
 fclose(in);
 back(1);
 FILE *out=fopen("copii.out","w");
 fprintf(out,"%d\n",rasp);
 fclose(out);
 return 0;
}