Cod sursa(job #424926)

Utilizator ooctavTuchila Octavian ooctav Data 25 martie 2010 12:40:01
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 11
int N;
int A[NMAX][NMAX];
int g[NMAX];
vector<int> GRUP[NMAX];
int SOL = 0;

void verificare(int NRG)
{
	if(NRG < 2 )
			return;
	int u[NMAX] = {0};
	
	for(int i = 1 ; i <= NRG ; i++)
	{
		for(int j = 0 ; j < GRUP[i].size() ; j++)
			for(int k = 1 ; k <= N ; k ++)
				if(A[GRUP[i][j]][k] == 1)
					u[g[k]] = i;
				
		for(int k = 1 ; k <= NRG ; k++)
			if(k != i && u[k] != i)
				return;		
	}
	
	SOL++;
}

void back(int k, int NRG)
{
	if(k == N + 1)
	{
		verificare(NRG);
		return;
	}
	
	for(int i = 1 ; i <= NRG ; i++)
	{
		GRUP[i].push_back(k);
		g[k] = i;
		back(k + 1, NRG);
		GRUP[i].pop_back();
	}
	
	GRUP[++NRG].push_back(k);
	g[k] = NRG;
	back(k + 1 , NRG);
	GRUP[NRG--].pop_back();
}

void citire()
{
	char a;
	scanf("%d\n",&N);
	for(int i = 1 ; i <= N ; ++i)
		for(int j = 1 ; j <= N ; ++j)
		{
			scanf("%c",&a);
			if(a == '\n')
				scanf("%c",&a);
			A[i][j] = a - '0';
		}
}

int main()
{
	freopen("copii.in","r",stdin);
	freopen("copii.out","w",stdout);
	citire();
	back(1,0);
	printf("%d",SOL);
	return 0;
}