Cod sursa(job #433593)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 3 aprilie 2010 22:13:46
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#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;
}