Cod sursa(job #825371)

Utilizator ericptsStavarache Petru Eric ericpts Data 28 noiembrie 2012 22:08:38
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
int v[11];
int g[11];
int pr[11];
int u;
int n;
int sol;

bool ver(int gr);

void back(int i,int lvl)
{
    if(((u|1)+1) == (1<<(n+1)))
    {
        if(lvl >= 3 && ver(lvl-1))
            ++sol;
        return;
    }
    int init = u;
    int initpr = pr[lvl];
    int initg = g[lvl];
    for(;i<=n;++i)
    {
        if(!(u & (1<<i)))
        {
            u |= (1<<i);
            pr[lvl] |= v[i];
            g[lvl] |= (1<<i);
            back(i+1,lvl+1);
            back(i+1,lvl);
            u ^= (1<<i);
            pr[lvl] ^=v[i];
            g[lvl] ^= (1<<i);
        }
    }
}
bool ver(int gr)
{
    int i,j,k,l;
    int gas;
    for(i=1;i<=gr;++i)
    {
        gas = 0;
        for(j=1;j<=gr;++j)
        {
            if(i!=j)
                if(!(pr[i] & g[j]))
                    return 0;
        }
    }
    return 1;
}

int main()
{
    freopen("copii.in","r",stdin);
    freopen("copii.out","w",stdout);
    setvbuf(stdin,NULL,_IOFBF,1024);
    int i,j;
    char c;
    scanf("%d\n",&n);
    for(j=1;j<=n;++j)
    {
        for(i=1;i<=n;++i)
        {
            scanf(" \n%c\n ",&c);
            if(c-'0')
                v[j] |= (1<<i);
        }
    }
    back(1,1);
    printf("%d\n",sol);
    return 0;
}