Pagini recente » Cod sursa (job #286233) | Cod sursa (job #2759868) | Cod sursa (job #1497963) | Cod sursa (job #2064832) | Cod sursa (job #2474331)
#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;
}