Cod sursa(job #1868221)

Utilizator Coroian_DavidCoroian David Coroian_David Data 4 februarie 2017 18:14:26
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>

using namespace std;

FILE *f, *g;

int n;

int a[200][200];
int p[200][200];

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

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

        for(j = 1; j <= n; j ++)
        {
            fscanf(f, "%c", &spatiu);

            p[i][j] = spatiu - '0';
        }


        fscanf(f, "%c", &spatiu);
    }

    fclose(f);
}

int rez;

int stk[200];

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

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


   // printf("%d\n", mx);
    int ok = 1;
    for(i = 1; i <= mx; i ++)
    {
        for(j = 1; j <= mx; j ++)
        {
            if(i != j && a[i][j] == 0)
            {
                ok = 0;
            }

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

    rez += ok;
}

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

    else
    {
        int i;

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

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

            bkt(k + 1, mx);
        }

        stk[k] = mx + 1;
        bkt(k + 1, mx + 1);
    }
}

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

    bkt(1, 0);

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

    fclose(g);
}

int main()
{
    readFile();

    solve();

    return 0;
}