Cod sursa(job #421535)

Utilizator raduzerRadu Zernoveanu raduzer Data 21 martie 2010 14:32:29
Problema Copii Scor 100
Compilator cpp Status done
Runda Algoritmiada 2010, Runda 4, Clasele 9-10 Marime 1.5 kb
#include <cstdio>

int n, z, sol;
char s[16][16];
int g[16][16];
int f[16];
int q[16];
char prec[1 << 11][1 << 11];
int q1[16], q2[16];
int conf[16];

int check()
{
	int i, j;

	for (i = 1; i <= z; ++i)
		for (j = 1; j <= z; ++j)
			if (i != j && !prec[conf[i]][conf[j]])
				return 0;

	return 1;
}

void back(int x)
{
	if (x > n)
	{
		if (z == 1)
			return;

		if (check())
			++sol;

		return;
	}

	for (int i = 1; i <= z + 1; ++i)
	{
		int sz = z;

		if (i > sz)
			++z;

		g[i][++g[i][0]] = x;
		f[x] = i;
		conf[i] += 1 << x;

		back(x + 1);

		conf[i] -= 1 << x;
		f[x] = 0;
		--g[i][0];

		z = sz;
	}
}

int main()
{
	int i, j, k, l;
	freopen("copii.in", "r", stdin);
	freopen("copii.out", "w", stdout);

	scanf("%d", &n);

	for (i = 1; i <= n; ++i)
		scanf(" %s ", s[i]);

	for (i = 1; i < (1 << n); ++i)
	{
		z = 0;

		for (j = 0; j < n; ++j)
			if (i & (1 << j))
				q[z++] = j + 1;

		for (j = 1; j < (1 << z); ++j)
		{
			q1[0] = 0;
			q2[0] = 0;

			for (k = 0; k < z; ++k)
				if (j & (1 << k))
					q1[++q1[0]] = q[k];
				else
					q2[++q2[0]] = q[k];

			if (!q1[0] || !q2[0])
				continue;

			int ok = 0;

			for (k = 1; k <= q1[0] && !ok; ++k)
				for (l = 1; l <= q2[0]; ++l)
					if (s[q1[k]][q2[l] - 1] == '1')
					{
						ok = 1;
						break;
					}

			if (!ok)
				continue;

			int conf1 = 0, conf2 = 0;

			for (k = 1; k <= q1[0]; ++k)
				conf1 += (1 << q1[k]);
			for (k = 1; k <= q2[0]; ++k)
				conf2 += (1 << q2[k]);

			prec[conf1][conf2] = 1;
		}
	}

	z = 0;
	back(1);

	printf("%d\n", sol);
}