Cod sursa(job #997394)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 13 septembrie 2013 23:10:42
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>
#define NMax 16

using namespace std;

int n, nrSub, st[NMax];
int sol;
char a[NMax][NMax];
bool prieten[NMax][NMax];

inline void Read()
{
    ifstream f ("copii.in");
    f>>n;
    int i, j;
    for (i=1; i<=n; ++i)
        f>>(a[i]+1);
    f.close();
    for (i=1; i<=n; ++i)
        for (j=1; j<=n; ++j)
            prieten[i][j] = (a[i][j] == '1');
}

inline void Verif()
{
    if (nrSub == 1)
        return ;

    bool mat[NMax][NMax];
    /// mat[i][j] = true daca echipa j are cel putin un copil in multimea de prieteni a echipei i
    int i, j;
    for (i=1; i<=n; ++i)
        for (j=1; j<=n; ++j)
            mat[i][j] = false;
    for (i=1; i<=n; ++i)
        for (j=1; j<=n; ++j)
            if (prieten[i][j]) /// daca copiii i si j sunt prieteni atunci echipa copilului j are cel putin un copil
                mat[st[i]][st[j]] = true; /// in multimea de prieteni a copilului i si acel copil este j
    for (i=1; i<=nrSub; ++i)
        for (j=1; j<=nrSub; ++j)
            if (i!=j && !mat[i][j]) /// daca am gasit o multime j care nu are niciun copil in multimea de prieteni a echipei i
                return ;
    ++sol;
}

inline void Back(int k)
{
    if (k == n+1)
    {
        Verif();
        return ;
    }
    for (int i = 1; i<=nrSub; ++i)
    {
        st[k] = i;
        Back(k+1);
    }
    ++nrSub;
    st[k] = nrSub;
    Back(k+1);
    --nrSub;
}

inline void Write()
{
    ofstream g("copii.out");
    g<<sol<<"\n";
    g.close();
}

int main()
{
    Read();
    Back(1);
    Write();
    return 0;
}