Cod sursa(job #509711)

Utilizator titusuTitus C titusu Data 11 decembrie 2010 16:39:19
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>
#include <iostream>
using namespace std;

int n,a[101][101],x[101],rez;

void VerifSol(int mx){
	int v[101][101];
	for(int i=1;i<=mx;++i)
		for(int j=1;j<=mx;++j)
			v[i][j]=0;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(a[i][j]==1 && i-j  && x[i]-x[j])
				v[x[i]][x[j]]=1;
	for(int i=1;i<=mx;++i)
		for(int j=1;j<=mx;++j)
			if(i-j && v[i][j]==0)
				return ; //aici este diferenta de la 80 la 100: daca las sa mearga pana la capat, ia doar 80
	rez++;
}

void back(int k,int nn){
	for(int i=1;i<=nn;++i){
		x[k]=i;
		if(k==n)
			VerifSol(nn);
		else
			back(k+1,nn);
	}
	x[k]=nn+1;
	if(k==n)
		VerifSol(nn+1);
	else
		back(k+1,nn+1);
}

int NC=0;

void Gen(int k){
	if(k==n+1)
		VerifSol(NC);
	else{
		for(int i=1;i<=NC;++i){
			x[k]=i;
			Gen(k+1);
		}
		NC++;
		x[k]=NC;
		Gen(k+1);
		NC--;
	}
}

int main(){
	ifstream fin("copii.in");
	ofstream fout("copii.out");
	fin>>n;
	char s[111];
	fin.getline(s,111);
	for(int i=1;i<=n;++i){
		fin.getline(s,111);
		for(int j=1;j<=n;++j)
			a[i][j]=s[j-1]-'0';
	}
	Gen(1);
	//back(1,0);
	fout<<rez-1<<endl;
	return 0;
}