Cod sursa(job #1555237)

Utilizator antanaAntonia Boca antana Data 22 decembrie 2015 14:35:07
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<cstdio>
#include<string.h>
using namespace std;
int st[12], n, p;
int v[12];
long long echipe[12];
int maxim(int k)
{
    int i;
    int maxi=0;
    for(i=1;i<=k;i++)
        if(maxi<st[i])
            maxi=st[i];
    return maxi;
}
int verificare(int ec)
{
    int nre=0, i, gasit=1, b=0, j;
    nre=maxim(n);
    if(nre==1)
        return 0;
    for(i=1;i<=ec;i++)
    {
        j=1;
        while(st[j]!=i)
            j++;
        b=v[j];
        for(j=j+1;j<=n;j++)
        {
            if(st[j]==i)
                b=(b|v[j]);
        }
        for(j=1;j<=ec;j++)
        {
            if(j!=i)
                if((echipe[j]&b)==0)
                    return 0;
        }
    }
    return 1;
}
void bkt(int k, int ec)
{
    int i;
    if(k==n+1)
    {
        if(verificare(ec))
            p++;
    }
    else{
        for(i=1;i<=maxim(k-1)+1;i++)
        {
            st[k]=i;
            echipe[i]+=(1<<k-1);
            bkt(k+1, maxim(k));
            echipe[i]-=(1<<k-1);
        }
    }
}
int main()
{
    freopen("copii.in", "r", stdin);
    freopen("copii.out", "w", stdout);
    int i, j, nr=0;
    char c;
    scanf("%d\n", &n);
    for(i=1;i<=n;i++)
    {
        for(j=0;j<n;j++)
        {
            c=getchar();
            v[i]=v[i]+((c-'0')<<j);
        }
        c=getchar();
    }
    bkt(1, 0);
    printf("%d", p);
    return 0;
}