Cod sursa(job #590056)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 15 mai 2011 11:44:19
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 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;
}