Cod sursa(job #424419)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 24 martie 2010 20:47:07
Problema Copii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<stdio.h>
#define infile "copii.in"
#define outfile "copii.out"
#define nmax 13
char ad[nmax][nmax]; //matricea de adiacenta
char adgr[nmax][nmax]; //matricea de adiacenta pt grupuri
char b[nmax]; //b[i]=grupa din care fae parte copilul i
int n; //numarul de copii
int xxx; //numarul de configuratii

void read()
{
	int i;
	scanf("%d\n",&n);
	for(i=1;i<=n;i++)
		fgets(ad[i]+1,nmax,stdin);
}

void init()
{
	int i,j;
	
	//scandem '0'
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			ad[i][j]-='0';
}

int verif(int gr)
{
	int i,j;
	
	//golim
	for(i=1;i<=gr;i++)
		for(j=1;j<=gr;j++)
			adgr[i][j]=0;
	
	//construim
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(ad[i][j]) adgr[b[i]][b[j]]=1;
	
	//verificam
	for(i=1;i<=gr;i++)
		for(j=1;j<=gr;j++)
			if(i!=j && !adgr[i][j])
				return 0;
	
	return 1;
}

void bk(int nr, int gr)
{
	//nr=al catelea copil il rezolvam
	//gr=nr-ul de grupe formate
	if(nr>n)
	{ //daca am repartizat toti copii
		if(gr>=2 && verif(gr)) xxx++;
		return;
	}
	int i;
	//repartizam copilul in una din grupe
	for(i=1;i<=gr;i++)
	{
		b[nr]=i;
		bk(nr+1,gr);
	}
	//copilul formeaza o grupa noua
	b[nr]=gr+1;
	bk(nr+1,gr+1);
}

void write()
{
	printf("%d\n",xxx);
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	init();
	bk(1,0);
	write();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}