Cod sursa(job #1866802)

Utilizator Tiberiu02Tiberiu Musat Tiberiu02 Data 3 februarie 2017 15:50:05
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
# include <iostream>
# include <fstream>

# include <vector>

using namespace std;

ifstream fin( "copii.in" );
ofstream fout( "copii.out" );

typedef vector<int> mult;
vector<mult> t;

const int MAX_N = 10;

int n, k = 0, ix[MAX_N];
bool f[MAX_N][MAX_N];

bool check( void ) {
    if ( t.size() == 1 )
        return 0;

    for ( int i = 0; i < t.size(); i ++ ) {
        int d = ( 1 << i );
        for ( int j : t[i] ) {
            for ( int k = 0; k < n; k ++ )
                if ( f[j][k] )
                    d |= ( 1 << ix[k] );
        }

        if ( d != ( 1 << t.size() ) - 1 )
            return 0;
    }

    return 1;
}

void bkt( int p = 0 ) {
    if ( p == n ) {
        k += check();
    } else {
        for ( int i = 0; i < t.size(); i ++ ) {
            ix[p] = i;
            t[i].push_back( p );
            bkt( p + 1 );
            t[i].pop_back();
        }
        ix[p] = t.size();
        t.push_back( vector<int>( 1, p ) );
        bkt( p + 1 );
        t.pop_back();
    }
}


int main() {
    fin >> n;

    for ( int i = 0; i < n; i ++ )
        for ( int j = 0; j < n; j ++ ) {
            char ch;
            fin >> ch;

            f[i][j] = ( ch == '1' );
            cout << (int)f[i][j] << ' ';
        }

    bkt();
    fout << k;

    return 0;
}