Cod sursa(job #972375)

Utilizator marius135Dumitran Adrian Marius marius135 Data 11 iulie 2013 15:36:12
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 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, int last ) {
     
    if( level > 2 && count_level == 0 && count == n) {
        
		/*for( int i = 1; i <= n; ++i)
			cout<<sel[i]<<" ";
		cout<<"    "<<level-1<<endl;*/
		
		rezults++;
		
        return ;
    }
     
    for( int i = last; 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, i + 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, 2 );
        }
    }       
}   
 
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, 2);
     
    cout<<rezults<<endl;
 
    return 0;
}