Cod sursa(job #421718)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 21 martie 2010 15:57:48
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <cassert>

using namespace std;

const int MAXN = 15;

int N, Sol;
char A[MAXN][MAXN];
vector <int> grup[MAXN];
int g[MAXN];

void back(int k, int ng) {

	if (k > N) {
		
		if (ng < 2) 
			return;

		int u[MAXN];
		memset(u, 0, sizeof(u));

		for (int i = 1; i <= ng; ++i) {
			for (size_t 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 j = 1; j <= ng; ++j)
				if (u[j] != i && i != j)
					return;
		}

		++Sol;
	
		return;
	}

	for (int i = 1; i <= ng; ++i) {
		grup[i].push_back(k);
		g[k] = i;
		back(k+1, ng);
		grup[i].pop_back();
	}

	grup[++ng].push_back(k);
	g[k] = ng;
	back(k+1, ng);
	grup[ng--].pop_back();
}

int main() {

	ifstream fin("copii.in");
	ofstream fout("copii.out");

	fin >> N;
	assert(1 <= N && N <= 10);

	for (int i = 1; i <= N; ++i) {
		fin >> (A[i]+1);
		for (int j = 1; j <= N; ++j) 
			assert('0' <= A[i][j] && A[i][j] <= '1');
	}

	back(1, 0);

	fout << Sol << endl;

	return 0;
}