Pagini recente » Cod sursa (job #436196) | Cod sursa (job #878895) | Cod sursa (job #2139831) | Cod sursa (job #1941293) | Cod sursa (job #972321)
Cod sursa(job #972321)
#include<stdio.h>
#include<iostream>
using namespace std;
int rezults = 0;
char v[12][12];
int sel[12], n;
int ccount[12];
int oameni[12][12];
bool test( int level1, int level2) {
for( int i = 0; i <= ccount[level1] ; ++i)
for( int j = 0; j <= ccount[level2]; ++j)
if( v[ oameni[level1][i] ] [ oameni[level2][j] - 1] == '1')
return 1;
return 0;
}
bool test( int level ){
bool ok = 1;
for( int i = 1; ok && i < level; ++i)
ok *= test(level, i) * test( i, level);
return ok;
}
void back( int level, int count_level, int count ) {
if( level > 2 && count_level == 0 && count == n) {
rezults++;
return ;
}
for( int i = 2; i <= n; ++i) {
if( sel[i] == 0 ) {
sel[i] = level;
oameni[level][count_level] = i;
ccount[level] = count_level;
back( level, count_level + 1, count + 1);
ccount[level] = count_level - 1;
sel[i] = 0;
if( count_level == 0) return;
}
}
if( count_level) {
ccount[level] = count_level - 1;
if( test( level ) ) {
back( level + 1, 0, count );
}
}
}
int main() {
freopen("copii.in", "r", stdin);
//freopen("copii.out", "w", stdout);
cin>>n;
for( int i = 1; i <= n; ++i)
cin>>v[i];
oameni[1][0] = 1;
sel[1] = 1;
back( 1, 1, 1);
cout<<rezults<<endl;
return 0;
}