Pagini recente » Cod sursa (job #3151836) | Cod sursa (job #1613386) | Cod sursa (job #769591) | Cod sursa (job #1419140) | Cod sursa (job #422923)
Cod sursa(job #422923)
#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;
}