Cod sursa(job #961361)

Utilizator primulDarie Sergiu primul Data 11 iunie 2013 22:26:20
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
 
int N, X[12], Ans;
bool Mat[12][12], A[12][12];
char S[12];
 
bool Check(int Groups)
{
    int i, j;
    for(i = 1; i <= Groups; ++ i)
        for(j = 1; j <= Groups; ++ j)
            A[i][j] = 0;
 
    for(i = 1; i <= N; ++ i)
        for(j = 1; j <= N; ++ j)
            if(Mat[i][j])
                A[ X[i] ][ X[j] ] = 1;
 
    for(i = 1; i <= Groups; ++ i)
        for(j = 1; j <= Groups; ++ j)
            if(!A[i][j] && i != j)
                return 0;
    return 1;
}
 
void Back(int Pos, int Gr)
{
    if(Pos == N + 1)
    {
        Ans += Check(Gr);
        return ;
    }
    int i = 1;
    while(i <= Gr)
        X[Pos] = i, Back(Pos + 1, Gr), i ++;
    X[Pos] = Gr + 1;
    Back(Pos + 1, Gr + 1);
}
 
int main()
{
    freopen("copii.in", "r", stdin);
    freopen("copii.out", "w", stdout);
    scanf("%i\n", &N);
    for(int i = 1; i <= N; ++ i)
    {
        gets(S + 1);
        for(int j = 1; j <= N; ++ j)
            Mat[i][j] = S[j] - '0';
    }
    Back(1, 0);
    printf("%i\n", Ans - 1);
    return 0;
}