Cod sursa(job #1750923)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 31 august 2016 14:31:26
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

ifstream cin("copii.in");
ofstream cout("copii.out");

const int MAXN = 10;

int n, answer = 0;
char a[1 + MAXN][1 + MAXN];
vector<int> group[1 + MAXN];
int which[1 + MAXN], seen[1 + MAXN];

bool Check(int groups) {
    if (groups < 2)
        return false;
    memset(seen, 0, sizeof(seen));
    for (int i = 1; i <= groups; i++) {
        for (int j = 0; j < group[i].size(); j++)
            for (int k = 1; k <= n; k++)
                if (a[group[i][j]][k] == '1')
                    seen[which[k]] = i;
        for (int j = 1; j <= groups; j++)
            if (seen[j] != i && i != j)
                return false;
    }
    return true;
}

void Backtracking(int child, int groups) {
    if (child == n + 1) {
        if (Check(groups))
            answer++;
        return;
    }
    for (int i = 1; i <= groups; i++) {
        group[i].push_back(child);
        which[child] = i;
        Backtracking(child + 1, groups);
        group[i].pop_back();
    }
    groups++;
    group[groups].push_back(child);
    which[child] = groups;
    Backtracking(child + 1, groups);
    group[groups].pop_back();
    groups--;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i] + 1;
    Backtracking(1, 0);
    cout << answer << "\n";
    return 0;
}