Pagini recente » Cod sursa (job #2659088) | Cod sursa (job #2835119) | Cod sursa (job #919767) | Cod sursa (job #2635309) | Cod sursa (job #514385)
Cod sursa(job #514385)
#include<fstream>
#include<iostream>
#define maxn 15
using namespace std;
int n, p[maxn], pm[maxn], mm[maxn];
int sub = -1, aux[maxn], result, s[maxn], set[maxn];
ofstream g("copii.out");
void verifica() {
int cod = 1;
for (int i = 0; i <= sub; i++) {
if (mm[i] != ((1<<(sub+1)) - 1) ) {
cod = 0;
break;
}
}
if (cod == 1) {
result++;
}
}
void back(int k);
void pune(int k, int i) {
s[k] = i;
int a = set[i];
int b = pm[i];
int v[30];
set[i] = set[i] | (1 << k);
pm[i] = pm[i] | p[k];
for (int j = 0; j <= sub; j++)
v[j] = mm[j];
for (int j = 0; j <= sub; j++) {
if ((set[j] & p[k]) > 0) {
mm[i] = mm[i] | (1 << j);
}
if ((pm[j] & (1 << k)) > 0) {
mm[j] = mm[j] | (1 << i);
}
}
if (k == n-1) {
if (sub >= 1)
verifica();
}
else
back(k+1);
set[i] = a;
pm[i] = b;
for (int j = 0; j <= sub; j++)
mm[j] = v[j];
}
void back(int k) {
for (int i = 0; i <= sub; i++) {
pune(k, i);
}
sub++;
pune(k, sub);
sub--;
}
int main() {
ifstream f("copii.in");
int i, j, x;
char s[20];
f >> n;
for (i = 0; i < n; i++) {
f >> s;
int k = 1;
for (j = 0; j <= n-1; j++) {
x = s[j] - '0';
p[i] += k*x;
k = k<<1;
}
}
for (i = 0; i <= n; i++) {
mm[i] = mm[i] | (1<<i);
}
back(0);
g << result << '\n';
return 0;
}