Cod sursa(job #481290)

Utilizator darrenRares Buhai darren Data 31 august 2010 10:18:05
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <vector>

using namespace std;

int n, m;
int v[11], g[11], r[11];
vector<int> part[11];
int ntot;

void Back(int k, int np);
void Test(int np);

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

	fin >> n;

	char aux[11];
	for (int i = 1; i <= n; ++i)
	{
		fin >> aux;
		for (int j = 0; j < n; ++j)
			if (aux[j] == '1')
				v[i] |= (1 << j);
		v[i] |= (1 << (i - 1));
	}
	Back(1, 0);

	fout << ntot;

	fin.close();
	fout.close();
}

void Back(int k, int np)
{
	for (int i = 1; i <= np; ++i)
	{
		part[i].push_back(k);

		if (k == n) Test(np);
		else        Back(k + 1, np);

		part[i].pop_back();
	}

	part[np + 1].push_back(k);
	if (k == n) Test(np + 1);
	else        Back(k + 1, np + 1);
	part[np + 1].pop_back();
}

void Test(int np)
{
	if (np == 1) return;
	for (int i = 1; i <= np; ++i)
	{
		g[i] = 0, r[i] = 0;
		for (vector<int>::iterator it = part[i].begin(); it != part[i].end(); ++it)
			g[i] |= v[*it], r[i] |= (1 << (*it - 1));
	}
	for (int i = 1; i <= np; ++i)
		for (int j = 1; j <= np; ++j)
			if (i != j)
			{
				int ok = g[i] & r[j];
				if (ok == 0) return;
			}
	++ntot;
}