Cod sursa(job #2474331)

Utilizator flibiaVisanu Cristian flibia Data 14 octombrie 2019 23:41:01
Problema Copii Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("copii.in");
ofstream out("copii.out");
ofstream out2("copii2.out");

int n, msk[1500], fr[1500], nr, st[15];
char c;
bool viz[1500];
set<vector<int> > s;

void check(int n) {
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (i != j)
				if ((msk[st[i]] & st[j]) == 0) 
					return;
	vector<int> v;
	for (int i = 1; i <= n; i++)
		v.push_back(st[i]);
	
	sort(v.begin(), v.end());
	s.insert(v);
}

void back(int lvl, int mask, int nr) {
	st[lvl] = mask;
	if (lvl > 1)	
		check(lvl);
		
	if (__builtin_popcount(mask) < 2)
		return;	
		
	for (int submask = mask; submask > 0; submask = (submask - 1) & mask) {
		if (mask != submask && __builtin_popcount(submask) <= nr) {
			st[lvl] = mask ^ submask;
			back(lvl + 1, submask, __builtin_popcount(mask));
		}
	}
}
	
int main() {
	in >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) {
			in >> c;
			if (c == '1')
				fr[i] |= (1 << j);
		}
	
	for (int mask = 1; mask < (1 << n); mask++)
		for (int bit = 0; bit < n; bit++)
			if (mask & (1 << bit))
				msk[mask] |= fr[bit];
				
	back(1, (1 << n) - 1, n);
	out << s.size();
//	for (auto it : s) {
//		for (auto i : it) 
//			out << i << ' ';
//		out << '\n';
//	}
	return 0;
}