Pagini recente » Cod sursa (job #932929) | Cod sursa (job #2881908) | Cod sursa (job #3290326) | Cod sursa (job #73110) | Cod sursa (job #421535)
Cod sursa(job #421535)
#include <cstdio>
int n, z, sol;
char s[16][16];
int g[16][16];
int f[16];
int q[16];
char prec[1 << 11][1 << 11];
int q1[16], q2[16];
int conf[16];
int check()
{
int i, j;
for (i = 1; i <= z; ++i)
for (j = 1; j <= z; ++j)
if (i != j && !prec[conf[i]][conf[j]])
return 0;
return 1;
}
void back(int x)
{
if (x > n)
{
if (z == 1)
return;
if (check())
++sol;
return;
}
for (int i = 1; i <= z + 1; ++i)
{
int sz = z;
if (i > sz)
++z;
g[i][++g[i][0]] = x;
f[x] = i;
conf[i] += 1 << x;
back(x + 1);
conf[i] -= 1 << x;
f[x] = 0;
--g[i][0];
z = sz;
}
}
int main()
{
int i, j, k, l;
freopen("copii.in", "r", stdin);
freopen("copii.out", "w", stdout);
scanf("%d", &n);
for (i = 1; i <= n; ++i)
scanf(" %s ", s[i]);
for (i = 1; i < (1 << n); ++i)
{
z = 0;
for (j = 0; j < n; ++j)
if (i & (1 << j))
q[z++] = j + 1;
for (j = 1; j < (1 << z); ++j)
{
q1[0] = 0;
q2[0] = 0;
for (k = 0; k < z; ++k)
if (j & (1 << k))
q1[++q1[0]] = q[k];
else
q2[++q2[0]] = q[k];
if (!q1[0] || !q2[0])
continue;
int ok = 0;
for (k = 1; k <= q1[0] && !ok; ++k)
for (l = 1; l <= q2[0]; ++l)
if (s[q1[k]][q2[l] - 1] == '1')
{
ok = 1;
break;
}
if (!ok)
continue;
int conf1 = 0, conf2 = 0;
for (k = 1; k <= q1[0]; ++k)
conf1 += (1 << q1[k]);
for (k = 1; k <= q2[0]; ++k)
conf2 += (1 << q2[k]);
prec[conf1][conf2] = 1;
}
}
z = 0;
back(1);
printf("%d\n", sol);
}