Cod sursa(job #421000)

Utilizator gcosminGheorghe Cosmin gcosmin Data 20 martie 2010 22:15:39
Problema Copii Scor Ascuns
Compilator cpp Status done
Runda Marime 1.19 kb
#include <stdio.h>
#include <vector>
#include <bitset>
using namespace std;

int N;

bitset <20> leg[20];

int ng = 0, rez = 0;

vector <int> gg[20];
bitset <20> gg1[20];

void back(int k)
{
	int i, j;

	if (k == N + 1) {
		// trebuie sa vad daca e buna treaba sau nu
	
		int e = 1;

		for (i = 1; i <= ng && e; i++) {
			bitset <20> pr = 0;

			for (vector <int> :: iterator it = gg[i].begin(); it != gg[i].end(); ++it) pr |= leg[*it];

			for (j = 1; j <= ng; j++) {
				if (i == j) continue;

				if ((pr & gg1[j]) == 0) { e = 0; break; }
			}
		}

		rez += e;

		return;
	}

	// trebuie sa fac pentru asta d-aia... partitionare
	
	// bag in una existenta
	
	for (i = 1; i <= ng; i++) {
		gg[i].push_back(k);
		gg1[i][k] = 1;

		back(k + 1);

		gg[i].pop_back();
		gg1[i][k] = 0;
	}

	ng++;
	gg[ng].push_back(k);
	gg1[ng][k] = 1;

	back(k + 1);

	gg[ng].pop_back();
	gg1[ng][k] = 0;

	ng--;
}


int main()
{
	int i, j;
	char c;

	freopen("copii.in", "r", stdin);
	freopen("copii.out", "w", stdout);

	scanf("%d\n", &N);

	for (i = 1; i <= N; i++) {
		for (j = 1; j <= N; j++) {
			scanf(" %c", &c);
			leg[i][j] = c == '1';
		}
	}

	back(1);

	rez--; // nu pot sa ii iau pe toti

	printf("%d\n", rez);

	return 0;
}