Cod sursa(job #923911)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 23 martie 2013 22:38:35
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <vector>
 
using namespace std;
 
char ch[12];
bool a[12][12];
int n,sol,g[12];
vector <int> gr[12];
 
void back(int k,int ng)
{
    int i;
    if (k>n)
    {
        if (ng<2)
            return;
        int u[12];
        int k;
        unsigned int j;
        for (i=0;i<12;++i)
            u[i]=0;
        for (i=1;i<=ng;++i)
        {
            for (j=0;j<gr[i].size();++j)
                for (k=1;k<=n;++k)
                    if (a[gr[i][j]][k]==1)
                        u[g[k]]=i;
            for(int j=1;j<=ng;++j)
                if (u[j]!=i&&i!=j)
                    return;
        }
        ++sol;
        return;
    }
    for (i=1;i<=ng;++i)
    {
        gr[i].push_back(k);
        g[k]=i;
        back(k+1,ng);
        gr[i].pop_back();
    }
    ++ng;
    gr[ng].push_back(k);
    g[k]=ng;
    back(k+1,ng);
    gr[ng].pop_back();
    --ng;
}
 
int main()
{
    int i,j;
    freopen("copii.in","r",stdin);
    freopen("copii.out","w",stdout);
    scanf("%d\n",&n);
    for (i=1;i<=n;++i)
    {
        fgets(ch,12,stdin);
        for (j=0;j<n;++j)
            a[i][j+1]=ch[j]-'0';
    }
    back(1,0);
    printf("%d\n",sol);
    return 0;
}