Cod sursa(job #457270)

Utilizator SpiderManSimoiu Robert SpiderMan Data 18 mai 2010 18:39:22
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <string>

const char FIN[] = "copii.in";
const char FOU[] = "copii.out";
const int MAX = 12;

int N, V[MAX], nr;
char S[MAX][MAX];

int check (int poz)      // verifica daca e corecta solutia gasita
{
    int viz[MAX][MAX];   // verificam daca S[i][j] == '1', adica viz[V[i]][V[j]] = 1

    memset(viz, 0, sizeof (viz));

    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j)
            if ( S[i][j] == '1' )
                viz[V[i]][V[j]] = 1;

    for (int i = 0; i < poz; ++i)
        for (int j = 0; j < poz; ++j)
            if (viz[i][j] == 0)   // daca i, j nu a fost marcat in vectorul V
                if ( i != j)      // si daca i ≠ j
                    return 0;     // nu se respecta conditia
    return 1;
}

void copii (int k, int poz)
{
    if ( k == N )
        if (poz > 1)
            nr += check ( poz );  // incrementam cu 1 solutiile daca se respecta conditia
        else ;
    else
        for (int i = 0; i <= poz; ++i)
            if ( i < poz ) V[k] = i, copii (k + 1 , poz);    //vectorul cu solutii, V
            else V[k] = poz , copii (k + 1 , poz + 1);       //vectorul cu solutii, V

}

int main()
{
    freopen(FIN, "r", stdin);
    freopen(FOU, "w", stdout);

    scanf("%d\n", &N);

    for (int i = 0; i < N; ++i)
        fgets( S[i] , MAX, stdin);

    copii (0, 0);

    printf("%d", nr);
}