Cod sursa(job #972368)

Utilizator marius135Dumitran Adrian Marius marius135 Data 11 iulie 2013 15:21:40
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<stdio.h>
#include<iostream>

using namespace std;

int rezults = 0;
char v[12][12];
int sel[12], n;
int count[12];
int oameni[12][12];

bool test( int level1, int level2) {

	for( int i = 1; i <= n; ++i)
		for( int j = 1; j <= n; ++j)
			if( sel[i] == level1 && sel[j] == level2 && v[i][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;
			//count[level] = count_level;
			back( level, count_level + 1, count + 1);
			sel[i] = 0;
			if( count_level == 0) return;
		}			
	}
	if( count_level) {
		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];
	
	sel[1] = 1;
	back( 1, 1, 1);
	
	cout<<rezults<<endl;

	return 0;
}