Cod sursa(job #1511376)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 26 octombrie 2015 18:24:58
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

FILE *in, *out;

const int dmax = 10;

bool A[dmax+1][dmax+1], D[dmax+1][dmax+1];
int sol[dmax+1];

int N, answer;

void validitate(int m)
{
    memset ( D, 0, sizeof ( D ) );

    for ( int i = 1; i <= N; i++ )
            for ( int j = 1; j <= N; j++ )
                    if ( A[i][j] == 1 )
                            D[ sol[i] ][ sol[j] ] = 1;

    for ( int i = 1; i <= m; i++ )
            for ( int j = 1; j <= m; j++ )
                    if ( i != j )
                            if ( D[i][j] == 0 )
                                    return;

    answer++;
}

void afisare(int m)
{
    if(m >= 2) // POT SA AM SOLUTIE
    {
        validitate(m);
    }
}

void bkt(int p, int m) // m - NR MAX DE SUBMULTIMI DINTR - O PARTIRIE
{
    if(p-1 == N) afisare(m);
    else
    {
        for(int i = 1; i <= m; i++)
        {
            // PUN p IN SUBMULTIMEA i
            sol[p] = i;

            bkt(p+1,m);
        }

        sol[p] = m+1;
        bkt(p+1,m+1);
    }
}

int main()
{
    in = fopen("copii.in", "r");
    out = fopen("copii.out", "w");

    char c;

    fscanf(in, "%d", &N);
    fscanf(in, "%c", &c); // TREC DE ENTER

    for(int i = 1; i <= N; i++)
    {
        for(int j = 1; j <= N; j++)
        {
            fscanf(in, "%c", &c);

            int x = c - '0';

            A[i][j] = x;
        }

        fscanf(in, "%c", &c); // TREC DE ENTER
    }

    bkt(1,0);

    fprintf(out, "%d", answer);

    return 0;
}