Cod sursa(job #718656)

Utilizator nautilusCohal Alexandru nautilus Data 20 martie 2012 22:53:20
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<fstream>
#include<vector>
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;
}