Cod sursa(job #2475815)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 17 octombrie 2019 17:07:30
Problema Copii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

// nrij =in cate feluri pui i copii in j grupe
// nrij = nri-1j * j + nri-1,j-1
bool m[10][10];
int n, sol = 0;

inline bool verif(int *v, int nr_gr) {
    if (nr_gr < 2)
        return false;
    bool rel[10][10] = {0};
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (m[i][j] == 1) {
                rel[v[i] - 1][v[j] - 1] = 1;
            }
            if (m[j][i] == 1) {
                rel[v[j] - 1][v[i] - 1] = 1;
            }
        }
    }

    for (int i = 0; i < nr_gr; i++) {
        for (int j = 0; j < nr_gr; j++) {
            if (i != j && rel[i][j] != 1)
                return false;
        }
    }
    return true;
}

void back(int curr_size, int curr_pos, int *v) {
    if (curr_pos == n) {
        if (verif(v, curr_size))
            sol++;
        return;
    }
    for (int i = 1; i <= curr_size; i++) {
        v[curr_pos] = i;
        back(curr_size, curr_pos + 1, v);       
    }
    v[curr_pos] = curr_size + 1;
    back(curr_size + 1, curr_pos + 1, v);
}

int main() {
    in >> n;
    char a;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            in >> a;
            if (a == '0')
                m[i][j] = 0;
            else
                m[i][j] = 1;
        }
    }

    int v[10] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    back(1, 1, v);

    out << sol << '\n';
    return 0;
}