Cod sursa(job #698765)

Utilizator vlad2901Vlad Berindei vlad2901 Data 29 februarie 2012 15:52:43
Problema Copii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>

#define NMAX 12

int sol[NMAX], nrsol, c[NMAX][NMAX]; //c[i][j] = 1 daca echipa i are un prieten din echipa j
char a[NMAX][NMAX];
int n;

int check()
{
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            {
                c[i][j] = 0;
            }

    for(int i=0;i<n;++i)
    {
        int aux, ok;
        for(int j=0;j<n;++j)
        {
            if(a[i][j] == '1')
                c[sol[i+1]][sol[j+1]] = 1;
        }
    }
    for(int i=1;i<=sol[n];++i)
    {
        for(int j=1;j<=sol[n];++j)
        {
            if(!c[i][j] && i!=j)
            {
                return 0;
            }
        }
    }
    return 1;
}

void back(int k, int g)
{
    if(k == n + 1)
    {
        if(g >= 2 && check())
        {
            nrsol++;
        }
    }
    else
    {
        for(int i=1;i<=g;++i)
        {
            sol[k] = i;
            back(k+1, g);
        }
        sol[k] = g+1;
        back(k+1,g+1);
    }
}

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

    scanf("%d", &n);

    for(int i=0;i<n;++i)
    {
        scanf("%s", a[i]);
        //a[i][i] = '1';
    }

    sol[1] = 1;

    back(1,0);

    printf("%d", nrsol);



    return 0;
}