Cod sursa(job #1868209)

Utilizator Coroian_DavidCoroian David Coroian_David Data 4 februarie 2017 18:03:27
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>

using namespace std;

FILE *f, *g;

int n;

int a[20][20];
int p[20][20];

void readFile()
{
    f = fopen("copii.in", "r");

    fscanf(f, "%d", &n);
    int i, j;
    for(i = 1; i <= n; i ++)
    {
        fgetc(f);

        for(j = 1; j <= n; j ++)
            p[i][j] = fgetc(f) - '0';

    }

    fclose(f);
}

int rez;

int stk[20];

void verif(int k, int mx)
{
    int i;
    int j;
    int sum = 0;
    for(i = 1; i <= k; i ++)
    {
       // printf("%d ", stk[i]);

        sum += stk[i];

        for(j = 1; j <= k; j ++)
            a[stk[i]][stk[j]] = p[stk[i]][stk[j]];
    }

    if(sum == k)
        return ;

   // printf("\n");

    for(i = 1; i <= mx; i ++)
    {
        for(j = 1; j <= mx; j ++)
        {
            if(i != j && a[i][j] == 0)
                return;

            a[i][j] = 0;
        }
    }

    rez ++;
}

inline int mxa(int a, int b)
{
    return (a > b ? a : b);
}

void bkt(int k, int mx)
{
    if(k == n + 1)
    {
        verif(k - 1, mx);
    }

    else
    {
        int i;

       // printf("%d %d\n", mx + 1, k);

        for(i = 1; i <= mx + 1; i ++)
        {
            stk[k] = i;

            bkt(k + 1, mxa(i, mx));
        }
    }
}

void solve()
{
    g = fopen("copii.out", "w");

    bkt(1, 0);

    fprintf(g, "%d\n", rez);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    return 0;
}