Cod sursa(job #421599)

Utilizator radu_cppRadu Voroneanu radu_cpp Data 21 martie 2010 14:48:27
Problema Copii Scor 100
Compilator cpp Status done
Runda Algoritmiada 2010, Runda 4, Clasele 9-10 Marime 1.13 kb
#include <stdio.h>
#define MAXN 1030

char a[20][20];
char b[MAXN][MAXN];
int grupa[20];
int i,j,n,numar;

void back1(int lv, int conf1, int conf2)
{
	if (lv==i) { back1(lv+1,conf1+(1<<i), conf2); return;}
	if (lv==j) {back1(lv+1,conf1,conf2 + (1<<j)); return;}
	if (lv==n) 
		b[conf1][conf2]=1;
	else {
		back1(lv+1,conf1+(1<<lv),conf2);
		back1(lv+1,conf1,conf2+(1<<lv));
		back1(lv+1,conf1,conf2);
	}
}

void back(int lv, int nr)
{
	if (lv==n){
		int i,j;
		for (i=1; i<=nr; i++)
			for (j=1; j<i; j++)
				if ((!b[grupa[i]][grupa[j]]) || (!b[grupa[j]][grupa[i]]))
					return;
		if (nr>=2)
			numar ++;
	}
	else{
		int i;
		for (i=1; i<=nr; i++){
			grupa[i] += (1<<lv);
			back(lv+1,nr);
			grupa[i] -= (1<<lv);
		}
		grupa[nr+1] = (1<<lv);
		back(lv+1,nr+1);
	}
}

int main()
{
	freopen("copii.in","r",stdin);
	freopen("copii.out","w",stdout);
	scanf("%d\n",&n);
	for (i=0; i<n; i++){
		for (j=0; j<n; j++)
			scanf("%c",&a[i][j]);
		scanf("\n");
	}
	for (i=0; i<n; i++)
		for (j=0; j<n; j++)
			if (a[i][j]=='1')
				back1(0,0,0);
	numar =0;
	back(0,0);
	printf("%d\n",numar);
	return 0;
}