Cod sursa(job #1795758)

Utilizator Athena99Anghel Anca Athena99 Data 2 noiembrie 2016 20:31:46
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>
#include <string>

using namespace std;

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

const int nmax= 10;

int n, sol;
int v[nmax+1];

string s[nmax+1];

bool check( int x ) {
     int a[nmax+1][nmax+1];
     for ( int i= 0; i<=nmax; ++i ) {
          for ( int j= 0; j<=nmax; ++j ) {
               a[i][j]= 0;
          }
     }

     for ( int i= 1; i<=n; ++i ) {
          for ( int j= 0; j<n; ++j ) {
               a[v[i]][v[j+1]]|= (s[i][j]-'0');
          }
     }
     for ( int i= 1; i<=x; ++i ) {
          for ( int j= 1; j<=x; ++j ) {
               if ( i!=j && a[i][j]==0 ) {
                    return 0;
               }
          }
     }

     return 1;
}

void backt( int k, int sm ) {
     if ( k==n+1 ) {
          sol+= check(sm);
     } else {
          for ( int i= 1; i<=sm+1; ++i ) {
               v[k]= i;
               backt(k+1, max(i, sm));
          }
     }
}

int main(  ) {
     fin>>n;
     for ( int i= 1; i<=n; ++i ) {
          fin>>s[i];
     }

     backt(1, 0);

     fout<<sol-1<<"\n";

     return 0;
}