Cod sursa(job #972321)

Utilizator marius135Dumitran Adrian Marius marius135 Data 11 iulie 2013 14:29:49
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#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;
}