Cod sursa(job #422923)

Utilizator CezarMocanCezar Mocan CezarMocan Data 23 martie 2010 12:27:18
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

#define maxN 12

using namespace std;

int n, i, j, k, sol;
char ch;
int mat[maxN][maxN];
int prep[1 << maxN];
int st[maxN];
int conf[maxN], vec[maxN];

void back(int k, int gr) {
	int i, j, gr_nou, ok;
	if (k == n) {
		if (gr < 2) return;

//		fprintf(stderr, "%d %d\n", k, gr);

		ok = 1; 
		for (i = 1; i <= gr; i++) {
			for (j = 1; j <= gr; j++)
				if (j != i) {
					if ((conf[j] & prep[conf[i]]) == 0) {
						ok = 0;
						return;
					}
				}
		}

		sol += ok;

	}
	else {
		for (i = 1; i <= gr + 1; i++) {
			gr_nou = max(i, gr); 
			conf[i] += (1 << k);
			st[k + 1] = i;
			back(k + 1, gr_nou);
			conf[i] -= (1 << k);
		}
	}
}

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

	scanf("%d", &n);
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++) {
			scanf(" %c ", &ch);
			mat[i][j] = ch - '0';
		}

	for (i = 0; i < (1 << n); i++) {
		memset(vec, 0, sizeof(vec));
		for (j = 0; j < n; j++)
			if (i & (1 << j)) 
				for (k = 1; k <= n; k++)
					vec[k] = vec[k] | mat[j + 1][k];
		for (j = 1; j <= n; j++)
			prep[i] += vec[j] * (1 << (j - 1));
//		fprintf(stderr, "%d %d\n", i, prep[i]);
	}

	back(0, 0);

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


	return 0;
}