Cod sursa(job #550068)

Utilizator toniobFMI - Barbalau Antonio toniob Data 9 martie 2011 11:04:22
Problema Copii Scor 100
Compilator cpp Status done
Runda bkt Marime 0.98 kb
#include <fstream>
using namespace std;

ifstream FIn("copii.in");
ofstream FOut("copii.out");

const int NMax=1<<4;
char S[NMax][NMax];
bool a[NMax][NMax];
int sol[NMax],N,MAX;
long long Ans;

void EXE(),IN(),OUT(),BKT(int);
bool BKT_CHECK();
int main(){EXE();return 0;}

void EXE(){
	IN();
	BKT(1);
	OUT();
}

void IN(){
	FIn>>N>>ws;
	for(int i=1;i<=N;FIn.getline(1+S[i++],N+1));
	for(int i=1;i<=N;++i){
		for(int j=1;j<=N;a[i][j]=S[i][j]-'0',++j);
	}
}

void BKT(int p){
	if(p==1+N){
		if(BKT_CHECK())
			++Ans;
		return;
	}
	for(int i=1;i<=MAX;++i){
		sol[p]=i;
		BKT(1+p);
	}
	sol[p]=++MAX;
	BKT(1+p);
	--MAX;
}

bool BKT_CHECK(){
	bool y[NMax][NMax];
	int i,j;
	if(MAX==1)
		return false;
	for(i=1;i<=MAX;++i){
		for(j=1;j<=MAX;++j){
			y[i][j]=false;
		}
	}
	for(i=1;i<=N;++i){
		for(j=1;j<=N;++j){
			if(a[i][j]){
				y[sol[i]][sol[j]]=true;
			}
		}
	}
	for(i=1;i<=MAX;++i){
		for(j=1;j<=MAX;++j){
			if(i!=j && !y[i][j])
				return false;
		}
	}
	return true;
}

void OUT(){
	FOut<<Ans;
}