Cod sursa(job #1960944)

Utilizator refugiatBoni Daniel Stefan refugiat Data 10 aprilie 2017 19:43:59
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
ifstream si("copii.in");
ofstream so("copii.out");
int e[15][15];
int l[15];
int lg[15];
int ap[15];
int cont;
int n;
int sol;
void verif()
{
    int pr;
    for(int i=1;i<=cont;++i)
    {
        ap[i]=0;
        for(int j=1;j<=lg[i];++j)
        {
            ap[i]+=(1<<e[i][j]);
        }
    }
    for(int i=1;i<=cont;++i)
    {
        pr=0;
        for(int j=1;j<=lg[i];++j)
        {
            pr|=l[e[i][j]];
        }
        //cout<<pr<<' ';
        for(int j=1;j<=cont;++j)
        {
            if(((pr&ap[j])==0)&&j!=i)
            {
          //      cout<<'\n';
                return;
            }
        }
    }
    //for(int i=1;i<=cont;++i)
    //    cout<<ap[i]<<' ';
    //cout<<'\n';
    ++sol;
}
void part(int x)
{
    if(x>n)
    {
        if(cont>1)
        {
            verif();
        }
        return;
    }
    for(int i=1;i<=cont;++i)
    {
        e[i][++lg[i]]=x;
        part(x+1);
        --lg[i];
    }
    e[++cont][1]=x;
    lg[cont]=1;
    part(x+1);
    --cont;
}
int main()
{
    si>>n;
    char a;
    int p;
    for(int i=1;i<=n;++i)
    {
        l[i]=0;
        for(int j=1;j<=n;++j)
        {
            si>>a;
            l[i]+=((a-'0')<<j);
        }
    }
    part(1);
    so<<sol;
    return 0;
}