Pagini recente » Cod sursa (job #2872850) | Cod sursa (job #1200485) | Cod sursa (job #2125923) | Cod sursa (job #470572) | Cod sursa (job #433593)
Cod sursa(job #433593)
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
#define Input "copii.in"
#define Output "copii.out"
#define Dim 11
int N, Nr_sol;
int e[Dim];
vector <int> b[Dim], v[Dim];
bool check( int x, int cnt ) {
bool f[Dim];
int i;
vector <int> :: iterator it1, it2;
if( cnt == 1 )
return 0;
memset( f, false, sizeof( f ) );
for( it1 = b[x].begin(); it1 != b[x].end(); ++it1 )
for( it2 = v[*it1].begin(); it2 != v[*it1].end(); ++it2 )
f[e[*it2]] = true;
for( i = 1; i <= cnt; ++i )
if( i != x && f[i] == false )
return 0;
return 1;
}
void back( int k, int cnt ) {
bool ok;
int i;
if( k == N + 1 ) {
ok = true;
for( i = 1; i <= cnt; ++i )
if( check( i, cnt ) == 0 ) {
ok = false;
break;
}
if( ok == true )
++Nr_sol;
return;
}
for( i = 1; i <= cnt; ++i ) {
b[i].push_back( k );
e[k] = i;
back( k + 1, cnt );
b[i].pop_back();
e[k] = 0;
}
b[++cnt].push_back( k );
e[k] = cnt;
back( k + 1, cnt );
b[cnt--].pop_back();
e[k] = 0;
}
int main() {
char s[Dim];
int i, j, lng;
ifstream fin( Input );
fin >> N;
fin.ignore( 1, '\n' );
for( i = 1; i <= N; ++i ) {
fin.getline( s, Dim );
lng = strlen( s );
for( j = 0; j < lng; ++j )
if( s[j] == '1' )
v[i].push_back( j + 1 );
}
fin.close();
back( 1, 0 );
ofstream fout( Output );
fout << Nr_sol;
fout.close();
return 0;
}