Cod sursa(job #421979)

Utilizator MKLOLDragos Ristache MKLOL Data 21 martie 2010 22:35:46
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include<stdio.h>
#define Nmax 40
int N,v[Nmax][Nmax],mul[Nmax][Nmax],co[Nmax],rez,veri[Nmax][Nmax];
char car;
void afis()
{
    for(int i=1;i<=N;++i)
    {
        for(int j=1;j<=mul[i][0];++j)
            printf("%d ",mul[i][j]);
    printf("\n");
    }
}
int acces(int a,int b)
{
         int z,ok=0,ok1=0;
        for(int i=1;i<=mul[a][0]&&!ok;++i)
        {
            z=mul[a][i];
            for(int j=1;j<=N&&!ok;++j)
            {
                if(v[z][j]==1&&co[j]==b)
                {
                    //printf("%d %d\n",z,j);
                ok=1;
                }
            }
        }
        for(int i=1;i<=mul[b][0]&&!ok1;++i)
        {
            z=mul[b][i];
            for(int j=1;j<=N&&!ok1;++j)
            {
                if(v[z][j]==1&&co[j]==a)
                ok1=1;
            }
        }
        if(ok==1&&ok1==1)
        return 1;
        return 0;
}
int ver()
{
for(int i=1;i<=N&&mul[i][0]!=0;++i)
            for(int j=1;j<=N&&mul[j][0]!=0;++j)
            {
                veri[i][j]=0;
            }

    for(int i=1;i<=N&&mul[i][0]!=0;++i)
        {
            for(int j=1;j<=mul[i][0];++j)
            {
                for(int z=1;z<=N;++z)
                {
                    if(v[mul[i][j]][z]==1)
                    {
                        veri[i][co[z]]=1;
                    }
                }
            }
        }
        for(int i=1;i<=N&&mul[i][0]!=0;++i)
            for(int j=1;j<=N&&mul[j][0]!=0;++j)
            {
                if(veri[i][j]==0&&i!=j)
                {
                 //   printf("%d %d\n",i,j);
                return 0;
                }
            }
        return 1;
}
void back(int k)
{
    if(k==N+1)
    {
        if(mul[2][0]!=0)
        if(ver())
        {
        ++rez;

        }
    }
    else
    for(int i=1;i<=N;++i)
    {
        if(mul[i-1][0]!=0)
        {
        co[k]=i;
        mul[i][++mul[i][0]]=k;
        back(k+1);
        mul[i][mul[i][0]--]=0;
        co[k]=0;
        }
    }
}
int main()
{
freopen("copii.in","r",stdin);
freopen("copii.out","w",stdout);
scanf("%d\n",&N);
mul[0][0]=1;
for(int i=1;i<=N;++i)
    {
    for(int j=1;j<=N;++j)
    {
    scanf("%c",&car);
    if(car=='1')
    v[i][j]=1;
    }
    scanf("\n");
    }
    back(1);
    printf("%d\n",rez);
}