Cod sursa(job #1814434)

Utilizator raulmuresanRaul Muresan raulmuresan Data 23 noiembrie 2016 23:02:36
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

const int MAXN = 15;

int n, Sol;
char a[MAXN][MAXN];
vector <int> grup[MAXN];
int st[MAXN], i, j;




void back(int k, int ng) {

    if (k > n) {

        if (ng < 2)
            return;

        int viz[MAXN];
        memset(viz, 0, sizeof(viz));
        //pentru fiecare grup luam jucatorii compenenti si marcam prietenii acestora
        //vectorul st[i] ne spune in ce grup se afla jucatorul i
        for (int i = 1; i <= ng; ++i) {
            memset(viz, 0, sizeof(viz));
            for (int j = 0; j < grup[i].size(); ++j)
            {
                for (int k = 1; k <= n; ++k)
                    if (a[grup[i][j]][k] == '1')
                        viz[st[k]] = 1;
            }


            for (int j = 1; j <= ng; ++j)
            {
                 if (viz[j]  == 0 && i != j)
                    return;
            }

        }

        ++Sol;

        return;
    }

    for (int i = 1; i <= ng; ++i) {
        grup[i].push_back(k);
        st[k] = i;
        back(k+1, ng);
        grup[i].pop_back();
    }

    grup[++ng].push_back(k);
    st[k] = ng;
    back(k+1, ng);
    grup[ng--].pop_back();
}

int main() {


    fin >> n;

    for (int i = 1; i <= n; ++i) {
        fin >> (a[i]+1);
    }

    back(1, 0);

    fout << Sol << endl;

    return 0;
}