Cod sursa(job #1357105)

Utilizator acomAndrei Comaneci acom Data 23 februarie 2015 19:31:04
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<fstream>
#include<bitset>
#include<vector>
using namespace std;
ifstream fin("copii.in");
ofstream fout("copii.out");
bitset <12> p[12];
vector <int> v[12];
char a[12];
int n,sol,ap[12],st[12],Max[12];
bool verif(int nr)
{
    int i,j,ii,jj;
    for (i=1;i<nr;++i)
    {
        if (!ap[i]) continue;
        for (j=i+1;j<=nr;++j)
        {
            if (!ap[j]) continue;
            int ok1=1,ok2=1;
            for (ii=0;ii<ap[i] && (ok1|ok2);++ii)
                for (jj=0;jj<ap[j] && (ok1|ok2);++jj)
                {
                    if (p[v[i][ii]][v[j][jj]])
                        ok1=0;
                    if (p[v[j][jj]][v[i][ii]])
                        ok2=0;
                }
            if (ok1|ok2)
                return false;
        }
    }
    return true;
}
void back(int k)
{
    int i;
    Max[k]=Max[k-1];
    for (i=1;i<=Max[k-1]+1;++i)
    {
        st[k]=i, ++ap[i], v[i].push_back(k);
        if (i>Max[k-1]) ++Max[k];
        if (k<n) back(k+1);
        else if (k==n && verif(n))
            ++sol;
        --ap[i], v[i].pop_back();
    }
}
int main()
{
    int i,j;
    fin>>n;
    for (i=1;i<=n;++i)
    {
        fin>>(a+1);
        for (j=1;j<=n;++j)
            if (a[j]=='1')
                p[i][j]=1;
    }
    st[1]=1, ap[1]=1, v[1].push_back(1), Max[1]=1;
    back(2);
    fout<<sol-1<<"\n";
    return 0;
}