Cod sursa(job #2475538)

Utilizator mihaicivMihai Vlad mihaiciv Data 17 octombrie 2019 08:29:11
Problema Copii Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <cstdlib>
//#define f cin
#define NMAX 8001
using namespace std;
ifstream f("copii.in");
ofstream g("copii.out");

int n, v[20];
int cnt;
int dim[20];
vector<int> a[20];

bool valid(int k, int v_max) {
    return true;
}

bool verif(vector<int> &b, int echipa_curenta, int v_max) {
    int vis[12];
    for (int i = 0; i < n; ++i) {
        vis[i] = 0;
    }
    vis[echipa_curenta] = 1;
    for (int i = 0; i < b.size(); ++i) {
        int el_curent = b[i];
        for (int j = 0; j < a[el_curent].size(); ++j) {
            vis[v[a[el_curent][j]]] = 1;

        }
    }
    for (int i = 0; i <= v_max; ++i) {
        if (vis[i] == 0) return false;
    }
    return true;
}

void prelucrare(int v_max) {

    if (v_max == 0) return;

    for (int i = 0; i <= v_max; ++i) {
        vector<int> b;
        for (int j = 0; j < n; ++j) {
            if (v[j] == i) {
                b.push_back(j);
            }
        }
        if (!verif(b, i, v_max)) return;
    }
    cnt ++;

}

void bk(int k, int v_max) {
    for (int i = 0; i <= v_max + 1; ++i) {
        v[k] = i;
        if (valid(k, max(v_max, v[k]))) {
            if (k == n - 1) {
                prelucrare(max(v[k], v_max));
            } else {
                if (v[k] > v_max) {
                    bk(k + 1, v[k]);
                } else {
                    bk(k + 1, v_max);
                }
            }
        }
    }

}

int main() {

    f >> n;
    for (int i = 0; i < n; ++i) {
        string s;
        f >> s;
        for (int j = 0; j < s.size(); ++j) {
            if (s[j] == '1') {
                a[i].push_back(j);
                dim[i] ++;
            }
        }
    }

    bk(0, -1);

    g << cnt;

    return 0;
}