Pagini recente » Rezultatele filtrării | Rezultatele filtrării | Rezultatele filtrării | Rezultatele filtrării | Cod sursa (job #421538)
Cod sursa(job #421538)
#include <algorithm>
#include <stdio.h>
using namespace std;
int n, x, y, sol;
char drum[32][32];
int drumCf[1032][1032];
int confi[32], rg[32];
inline void calcConf(int confa, int confb, int level)
{
if (level == n)
{
drumCf[confa][confb] = 1;
return;
}
if (level == x)
calcConf(confa | (1 << x), confb, level + 1);
else if (level == y)
calcConf(confa, confb | (1 << y), level + 1);
else
{
calcConf(confa, confb, level + 1);
calcConf(confa | (1 << level), confb, level + 1);
calcConf(confa, confb | (1 << level), level + 1);
}
}
inline void generPart(int level, int maxP)
{
if (level == n)
{
if (maxP)
{
memset(confi, 0, sizeof(confi));
for (int i = 0; i < n; i++)
confi[rg[i]] |= (1 << i);
for (int i = 0; i <= maxP; i++)
{
for (int j = i + 1; j <= maxP; j++)
if ((!drumCf[confi[i]][confi[j]]) || (!drumCf[confi[j]][confi[i]]))
return;
}
sol++;
}
return;
}
for (rg[level] = 0; rg[level] <= maxP + 1; rg[level]++)
generPart(level + 1, max(maxP, rg[level]));
}
int main()
{
freopen("copii.in", "r", stdin);
freopen("copii.out", "w", stdout);
scanf("%d\n", &n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%c", &drum[i][j]);
drum[i][j] -= '0';
}
scanf("\n");
}
int subMult = 1;
for (int i = 0; i < n; i++)
subMult *= 3;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (drum[i][j])
{
x = i, y = j;
calcConf(0, 0, 0);
}
generPart(0, -1);
printf("%d\n", sol);
fclose(stdin);
fclose(stdout);
return 0;
}