Cod sursa(job #1357328)

Utilizator zaharia_horiaZaharia Horia zaharia_horia Data 23 februarie 2015 21:24:10
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#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;
}