Cod sursa(job #2147333)

Utilizator ContDeRacistAliniateEBlat ContDeRacist Data 28 februarie 2018 17:40:19
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
///ardelean alexandru <[email protected]>
///To:alexandru ardelean
///Feb 26 at 7:25 PM
#include <fstream>

using namespace std;

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

const int N = 11;

int n, solutii(-1);

int p[N], c[N], v[N];
int sol[N];
char d[N][N];

void reset() {
    for (int i = 0; i < n; ++i) {
        p[i] = c[i] = 0;
    }
}

bool echipe(int sol[], int echipe) {
    reset();
    for (int i = 0; i < n; ++i) {
        p[sol[i]] += (1<<i);
        c[sol[i]] |= v[i];
    }
    /*for (int i = 0; i < n; ++i) {
            cout << sol[i] << " ";
    }
    cout << "\n";
    for (int i = 0; i <= echipe; ++i) {
            cout << p[i] << " ";
    }
    cout << "\n";
    for (int i = 0; i <= echipe; ++i) {
        cout << c[i] << " ";
    }
    cout << "\n\n";*/
    for (int i = 0; i <= echipe; ++i) {
        for (int j = 0; j <= echipe; ++j) {
            if (i != j && (p[i]&c[j]) == 0) {
                return false;
            }
        }
    }
    return true;
}

void bkt(int poz, int e) {
    if (poz == n) {
        if (echipe(sol, e)) {
            ++solutii;
        }
        return;
    }
    for (int i = 0; i <= e; ++i) {
        sol[poz] = i;
        bkt(poz + 1, e);
    }
    sol[poz] = e + 1;
    bkt(poz + 1, e + 1);
}

int main()
{
    char ch;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin.get(ch);
        for (int j = 0; j < n; ++j) {
            cin.get(d[i][j]);
        }
    }
    /*for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << d[i][j] << " ";
        }
        cout << "\n";
    }
    cout << "\n\n";*/
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            v[i] += ((d[i][j] - '0') * (1<<j));
        }
    }
    /*for (int i = 0; i < n; ++i) {
        cout << v[i] << " ";
    }
    cout << "\n\n";*/
    bkt(0, -1);
    cout << solutii;
    return 0;
}