Cod sursa(job #423448)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 23 martie 2010 21:21:35
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define NMAX 13
int V[NMAX], s[NMAX], Gr[NMAX], Pr[NMAX];
int n,sol;
void update(int k){
	for(int i = 1; (1<<i) <= V[k] && i <= k; ++i)
		if( (1<<i) & V[k])
			Pr[s[k]] |= (1<<s[i]);
	for(int i = 1; (1<<i) <= V[k] && i <= k; ++i)
		if( V[i] & (1<<k)) 
			Pr[s[i]] |= (1<<s[k]);
}		
void solutie(int nr){
	if(nr<2) return;
	for(int i = 1; i <= nr; ++i){
		Pr[i] |= (1<<i);
		if( Pr[i] != (1<<(nr+1))-2) return;
	}
	sol++;
}
void back(int k, int nr){
	if(k > n){
		solutie(nr);
		return ;
	}
	int v[NMAX];
	for(int i = 1; i <= nr+1; ++i){
		s[k] = i;
		Gr[i] += (1<<k);
		memcpy(v, Pr, sizeof(Pr));
		//Pr[i] |= V[k];
		update(k);
		back(k+1, max(i, nr));
		Gr[i] -= (1<<k);
		memcpy(Pr, v, sizeof(v));
		
	}
}
int main(){
	freopen("copii.in", "r", stdin);
	freopen("copii.out", "w", stdout);
	scanf("%d\n", &n);
	char S[NMAX];
	for(int i = 1; i <= n; ++i){
		fgets(S+1, NMAX, stdin);
		for(int j = 1; j <= n; ++j)
			if(S[j]=='1') V[i] += (1<<j);
	}
	back(1, 0);
	printf("%d\n", sol);
	return 0;
}