Cod sursa(job #421480)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 21 martie 2010 14:12:46
Problema Copii Scor 60
Compilator cpp Status done
Runda Algoritmiada 2010, Runda 4, Clasele 9-10 Marime 1.84 kb
#include <stdio.h>

using namespace std;

#define maxn 4096

long n, i, j, k, ok, mk, sol, ne, cun[20], conf[20], c2, cf[20], nb[20];
char m[20][20];

void back(long poz, long i)
{
    long a1, a2;
    if(poz == n)
    {
        if(ne>1)
            sol++;
        return;
    }
    if(cf[poz]==0)
    {
        ++ne;
        for(long j=1; j<(1<<n); j++)
        {
            if((j&i)==0 && ((j>>poz) & 1)==1)
            {
                cun[ne]=0;
                for(k=0; k<n; k++)
                    if((j>>k) &1)
                        cun[ne]=cun[ne]|nb[k];
                cun[ne]=cun[ne]&(((1<<n)-1)-j);
                ok=1;
                for(k=1; k<ne; k++)
                {
                    if((cun[ne]&conf[k])==0 || (cun[k]&j)==0)
                    {
                        ok=0;
                        break;
                    }
                }
                if(ok)
                {
                    conf[ne]=j;
                    for(k=0; k<n; k++)
                        if((j>>k)&1)
                            cf[k]=ne;
                    back(poz+1, i|j);
                    for(k=0; k<n; k++)
                        if((j>>k)&1)
                            cf[k]=0;
                }
            }
        }
        --ne;
    }
    else
        back(poz+1, i);
}
                    
                    

int main()
{
    freopen("copii.in", "r", stdin);
    freopen("copii.out", "w", stdout);
    scanf("%d\n", &n);
    for(i=0; i<n; i++)
    {
        gets(m[i]);
        for(j=0; j<n; j++)
        {
            m[i][j]-='0';
        }
        for(j=n-1; j>=0; j--)
        {
            nb[i]=nb[i]*2+m[i][j];
        }
    }
    ne=0;
    i=0;
    back(0, 0);
    printf("%d\n", sol);
    return 0;
}