Cod sursa(job #2475909)

Utilizator cyber_ghSoltan Gheorghe cyber_gh Data 17 octombrie 2019 19:19:33
Problema Copii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 11;
int cnt = 0;

int N;
int A[MAXN][MAXN];
int arr[MAXN];


    vector< vector<int> > relations(MAXN, vector<int>(MAXN, 0));

bool check(int arr[MAXN], int groups, int maxN) {
    for (int i = 0; i < MAXN; i++)
        for (int j = 0; j < MAXN; j++) relations[i][j] = 0;

    for (int from = 1; from <= maxN; from++) {
        for (int to = 1; to <= maxN; to++) {
            //if (arr[from] == arr[to]) continue;
            relations[ arr[from] ][ arr[to] ] |= A[from][to];
        }
    }

    for (int i = 1; i <= groups; i++) {
        for (int j = 1; j <= groups; j++) {

            if (i == j) continue;
            if (!relations[i][j]) return false;

        }
    }
    return true;
}

void backtrack(int lastGroup, int step, int maxN, int arr[MAXN]) {
    if ( step > maxN) {
        //if (lastGroup == 1) return ;
        cnt += check(arr, lastGroup, maxN);
        return;
    }

    for (int i = 1; i <= min (lastGroup + 1, maxN ); i++) {
        arr[step] = i;
        backtrack(max(i, lastGroup), step + 1, maxN, arr);
        arr[step] = 0;
    }
}

int main(){
    ifstream cin("copii.in");
    ofstream cout("copii.out");
    cin >> N;
    for( int i = 1; i <= N; i++) {
        for ( int j = 1; j <= N; j++) {\
            char x;
            cin >> x;
            if (x == '1') A[i][j] = 1;
            //cin >> A[i][j];
        }
    }
    backtrack(0, 1, N, arr);
    cout << cnt - 1;
    return 0;
}