Cod sursa(job #421382)

Utilizator savimSerban Andrei Stan savim Data 21 martie 2010 13:37:59
Problema Copii Scor 20
Compilator cpp Status done
Runda Algoritmiada 2010, Runda 4, Clasele 9-10 Marime 1.39 kb
#include <stdio.h>
#include <string.h>

char s[12];
bool A[12][12];

int n, sol;
int use[12], nr[12];
int wteam[12], add[12];
int vmax[12][12];

void back(int ind, int t) {
	if (ind > n) {
		if (t == 1) return;

		for (int i = 1; i <= t; i++) {
			int ok = 0;
			for (int j = 1; j <= nr[i]; j++) {
				memset(add, 0, sizeof(add));

            	int w = vmax[i][j];
				for (int k = 1; k <= n; k++)
					if (A[w][k] && wteam[k] != wteam[w])
						add[wteam[k]] = 1;

				int x = 0;
				for (int k = 1; k <= t; k++)
					x += add[k];

				if (x == t - 1) {
                	ok = 1;
					break;
				}
			}

			if (!ok) return;
		}

		sol++;
		return;
	}

	for (int j = 1; j <= t; j++)
		if (vmax[j][nr[j]] < ind) { //il pot pune pe ind in echipa j
			nr[j]++; 
			vmax[j][nr[j]] = ind;
			use[ind] = 1; wteam[ind] = j;

			back(ind + 1, t);

			vmax[j][nr[j]] = use[ind] = wteam[ind] = 0;
			nr[j]--;
		}

	//il pun pe ind intr-o echipa noua
	if (nr[t]) {
		nr[t + 1]++; wteam[ind] = t + 1;
		vmax[t + 1][nr[t + 1]] = ind; use[ind] = 1;
		
		back(ind + 1, t + 1);

		vmax[t + 1][nr[t + 1]] = use[ind] = wteam[ind] = 0;
		nr[t + 1]--;
	}
}

int main() {

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

	scanf("%d\n", &n);
	for (int i = 1; i <= n; i++) {
    	scanf("%s", s + 1); s[0] = ' ';
		for (int j = 1; j <= n; j++)
			A[i][j] = s[j] - '0';
	}

	back(1, 1);

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

	return 0;
}