Cod sursa(job #2127529)

Utilizator Monstergentleman35Ciopraga Razvan Monstergentleman35 Data 10 februarie 2018 18:47:47
Problema Copii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("copii.in");
ofstream fout("copii.out");

int nc,n,linie,coloana;
long long F;
int P[15];
char V[15],q;
bool Adiac[30][30];
short int MultPret[30][30];
bool Leg[15];

void generare(int);
void Afisare();
bool Verif();

int main()
{
 fin>>n;
 fin.get(q);
 for (linie=1;linie<=n;linie++)
 {
  fin.getline(V,15);
  for (coloana=1;coloana<=n;coloana++)
   Adiac[linie][coloana]=V[coloana-1]-'0';
 }
 generare(1);
 fout<<F;
 return 0;
}

void generare(int k)
{
 int i2,j;
 if (k==n+1)
 {
  if (Verif())
   F++;
 }
 else
 {
  for (i2=1;i2<=nc;i2++)
  {
   P[k]=i2;
   for (j=1;j<=n;j++)
    if (Adiac[k][j]==1)
     MultPret[i2][j]++;
   generare(k+1);
   for (j=1;j<=n;j++)
    if (Adiac[k][j]==1)
     MultPret[i2][j]--;
  }
  if (nc<n)
  {
   nc++;
   P[k]=nc;
   for (j=1;j<=n;j++)
    if (Adiac[k][j]==1)
     MultPret[nc][j]++;
   generare(k+1);
   for (j=1;j<=n;j++)
    if (Adiac[k][j]==1)
     MultPret[nc][j]++;
   nc--;
  }
 }
}

void Afisare()
{
 int i2,j;
 for (i2=1;i2<=nc;i2++)
 {
  for (j=1;j<=n;j++)
   if (P[j]==i2)
    fout<<j;
  fout<<"*";
 }
 fout<<"\n";
}

bool Verif()
{
 if (nc<2)
  return 0;
 int i2,j,s;
 for (i2=1;i2<=nc;i2++)
 {
  for (j=1;j<=n+1;j++)
   Leg[j]=0;
  for (j=1;j<=n;j++)
   if (MultPret[i2][j]>0&&i2!=P[j])
    Leg[P[j]]=1;
  for (j=1,s=0;j<=nc;j++)
   s+=Leg[j];
  if (s!=nc-1)
   return 0;
 }
 return 1;
}