Cod sursa(job #1631831)

Utilizator ciprianprohozescuProhozescu Ciprian ciprianprohozescu Data 5 martie 2016 19:14:04
Problema Copii Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <cstring>

using namespace std;

FILE *fin, *fout;

int n, nrp, p[15], nrsol, np[15];
bool A[15][15];
char c;

void gen(int k);
bool verifica();

int main()
{
    int i, j;
    fin = fopen("copii.in", "r");
    fout = fopen("copii.out", "w");
    fscanf(fin, "%d\n", &n);
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
        {
            fscanf(fin, "%c", &c);
            A[i][j] = c - '0';
        }
        fscanf(fin, "\n");
    }
    gen(1);
    fprintf(fout, "%d\n", nrsol);
    fclose(fout);
    return 0;
}

void gen(int k)
{
    int i;
    if (k == n + 1)
    {
        if (verifica())
            nrsol++;
    }
    else
    {
        for (i = 1; i <= nrp; i++)
        {
            p[k] = i;
            np[i]++;
            gen(k + 1);
            np[i]--;
        }
        p[k] = nrp + 1;
        nrp++;
        np[nrp]++;
        gen(k + 1);
        np[nrp]--;
        nrp--;
    }
}
bool verifica()
{
    int T[15][15], i, j;
    if (nrp == 1)
        return 0;
    for (i = 1; i <= n; ++i)
    {
        for (j = 0; j <= n; ++j)
            T[i][j] = 0;
    }
    for (i = 1; i <= n; ++i)
    {
        for (j = 1; j <= n; ++j)
        {
            if (A[j][i] && !T[p[j]][p[i]] && p[j] != p[i])
            {
                T[p[j]][0]++;
                T[p[j]][p[i]] = 1;
            }
        }
    }
    for (i = 1; i <= nrp; ++i)
    {
        if (T[i][0] < nrp - 1)
            return 0;
    }
    return 1;
}