Pagini recente » Cod sursa (job #2718190) | Cod sursa (job #2305225) | Cod sursa (job #1622253) | Cod sursa (job #1352102) | Cod sursa (job #718659)
Cod sursa(job #718659)
#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;
}