Cod sursa(job #1193347)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 31 mai 2014 14:58:37
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int N,copil[20],nr,sol,st[20];

inline int Verif()
{
    int team[20],fr[20],nre=0,i,j;
    for(i=1;i<=10;++i)
        team[i]=fr[i]=0;
    for(i=1;i<=N;++i)
    {
        fr[st[i]]|=copil[i];
        team[st[i]]|=(1<<(N-i));
        nre=max(nre,st[i]);
    }
    if(nre<2)
        return 0;
    for(i=1;i<=nre;++i)
        for(j=1;j<=nre;++j)
            if(i!=j)
                if(!(fr[i]&team[j]))
                    return 0;
    return 1;
}

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

int main()
{
    char sir[20];
    int i,j,len;
    freopen ("copii.in","r",stdin);
    freopen ("copii.out","w",stdout);
    scanf("%d", &N);
    for(i=1;i<=N;++i)
    {
        scanf("%s", (sir+1));
        len=strlen(sir+1);
        for(j=len;j;--j)
            if(sir[j]=='1')
                copil[i]+=(1<<(len-j));
    }
    Back(1);
    printf("%d\n", sol);
    return 0;
}