Cod sursa(job #421538)

Utilizator ProtomanAndrei Purice Protoman Data 21 martie 2010 14:33:15
Problema Copii Scor 100
Compilator cpp Status done
Runda Algoritmiada 2010, Runda 4, Clasele 9-10 Marime 1.63 kb
#include <algorithm>
#include <stdio.h>

using namespace std;

int n, x, y, sol;
char drum[32][32];
int drumCf[1032][1032];
int confi[32], rg[32];

inline void calcConf(int confa, int confb, int level)
{
	if (level == n)
	{
		drumCf[confa][confb] = 1;

		return;
	}
	if (level == x)
		calcConf(confa | (1 << x), confb, level + 1);
	else if (level == y)
		calcConf(confa, confb | (1 << y), level + 1);
	else
	{
		calcConf(confa, confb, level + 1);
		calcConf(confa | (1 << level), confb, level + 1);
		calcConf(confa, confb | (1 << level), level + 1);
	}
}

inline void generPart(int level, int maxP)
{
	if (level == n)
	{
		if (maxP)
		{
			memset(confi, 0, sizeof(confi));
			for (int i = 0; i < n; i++)
				confi[rg[i]] |= (1 << i);

			for (int i = 0; i <= maxP; i++)
			{
				for (int j = i + 1; j <= maxP; j++)
					if ((!drumCf[confi[i]][confi[j]]) || (!drumCf[confi[j]][confi[i]]))
						return;
			}

			sol++;
		}

		return;
	}
	for (rg[level] = 0; rg[level] <= maxP + 1; rg[level]++)
		generPart(level + 1, max(maxP, rg[level]));
}

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

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

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			scanf("%c", &drum[i][j]);

			drum[i][j] -= '0';
		}

		scanf("\n");
	}

	int subMult = 1;
	for (int i = 0; i < n; i++)
		subMult *= 3;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			if (drum[i][j])
			{
				x = i, y = j;

				calcConf(0, 0, 0);
			}

	generPart(0, -1);

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

	fclose(stdin);
	fclose(stdout);
	return 0;
}