Cod sursa(job #1703098)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 16 mai 2016 10:54:34
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <cstdio>

using namespace std;


int ans=0, i,j,n,
friends[12], /// prietenii copilului i
f[12], /// prietenii echipei i
a[12]; /// membrii echipei i
char S[12];

inline bool verif(int teams)
{
    for(int i=0; i<teams; ++i)
    for(int j=i+1; j<teams; ++j)
    if( !(a[i] & f[j]) || !(f[i] & a[j]) ) return 0;
    return 1;
}

void bakcool(int p, int teams)
{
    int i;
    if(p==n)
    {
        ans += verif(teams);
        return;
    }

    for(i=0; i<teams; ++i)
    {
         int before=f[i];
         a[i] += (1<<p);
         f[i]|=friends[p];
         bakcool( p+1, teams);
         a[i] -= (1<<p);
         f[i] = before;
    }

    f[teams] = friends[p];
    a[teams] = (1<<p);
    bakcool(p+1, teams+1);
}

int main()
{
    freopen("copii.in", "r", stdin);
    freopen("copii.out", "w", stdout);

    scanf("%d\n", &n);

    for(i=0; i<n; ++i)
    {
        gets(S);
        for(j=0; j<n; ++j)
        friends[i] += (S[j]=='1')*(1<<j);
    }

    bakcool(0,0);
    printf("%d\n", ans-1);

    return 0;
}