Pagini recente » Cod sursa (job #2086131) | Cod sursa (job #86038) | Cod sursa (job #2620085) | Cod sursa (job #1925431) | Cod sursa (job #424419)
Cod sursa(job #424419)
#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;
}