Cod sursa(job #1981132)

Utilizator TESTHARD123TEST CENTRE TESTHARD123 Data 14 mai 2017 20:52:14
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
#define NMAX 20
 
int n;
bool a[NMAX][NMAX];
vector<int>grupa[NMAX];
int g[NMAX],nrGrupe;
int sol;
 
void read()
{
 int i,j;
 char s[NMAX];
 
 ifstream fin("copii.in");
 fin>>n;
 fin.get();
 for (i=1; i<=n; ++i)
    {
     fin.get(s,NMAX);
     fin.get();
     for (j=0; j<(int)strlen(s); ++j)
         if (s[j] == '1')
             a[i][j+1] = 1;
     a[i][i] = 1;
    }
 fin.close();
}
 
void verificare()
{
 int i,j,k;
 int vg[NMAX],vgNr = 0;
 
 for (i=1; i<=n; ++i)
     vg[i] = 0;
  
 if (nrGrupe >= 2)
    {
     for (i=1; i<=nrGrupe; ++i) //selectez o grupa
         {
          for (j=0; j<(int)grupa[i].size(); ++j) //selectez un copil din grupa
               for (k=1; k<=n; ++k) //marchez grupele din care fac parte prietenii lui
                    if (a[grupa[i][j]][k] == 1 && vg[g[k]] != i)
                       {
                        vg[g[k]]++;
                        vgNr++;
                       }
          if (vgNr < nrGrupe * i) //daca copii din grupa i nu au relatii cu toate celelalte grupe, solutia nu e valida
              return;
         }
     sol++;
    }
}
 
void generare(int k)
{
 int i;
 if (k == n+1)
     verificare();
 else
    {
     for (i=1; i<=nrGrupe; ++i)
        {
         grupa[i].push_back(k);
         g[k] = i;
         generare(k+1);
         grupa[i].pop_back();
        }
     nrGrupe++;
     grupa[nrGrupe].push_back(k);
     g[k] = nrGrupe;
     generare(k+1);
     grupa[nrGrupe].pop_back();
     nrGrupe--;
    }
}
 
void afisare()
{
 ofstream fout("copii.out");
 fout<<sol<<'\n';
 fout.close();
}
 
int main()
{
 read();
 generare(1);
 afisare();
 return 0;
}