Cod sursa(job #1169775)

Utilizator swim406Teudan Adina swim406 Data 12 aprilie 2014 00:28:14
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <algorithm>
#define NMAX 11

using namespace std;

int N, mat[NMAX][NMAX], nr;

int verif (int team[NMAX], int nrech) {
    int ok[NMAX][NMAX], i, j, k;
    for (i = 1; i <= nrech; ++i)
        for (j = 1; j <= N; ++j)
            if (team[j] == i)
                for (k = 1; k <= N; ++k)
                    if (mat[j][k])
                        ok[i][team[k]] = 1;
    for (i = 1; i <= nrech; ++i)
        for (j = 1; j <= nrech; ++j)
            if (!ok[i][j] && i != j) return 0;
    return 1;
}

void back (int pos, int team[NMAX], int nrech) {
    int i;

    if (pos == N + 1) {
        if (nrech >= 2 && verif(team, nrech))
            ++nr;
        return;
    }

    for (i = 1; i <= nrech + 1; ++i) {
        team[pos] = i;
        back(pos + 1, team, max(nrech, i));
    }
}

int main() {
    freopen ("copii.in", "r", stdin);
    freopen ("copii.out", "w", stdout);
    int i, j, team[NMAX];
    char c;
    scanf ("%d", &N);
    for (i = 1; i <= N; ++i) {
        scanf ("%c", &c);
        for (j = 1; j <= N; ++j) {
            scanf ("%c", &c);
            if (c == '0') mat[i][j] = 0;
            else mat[i][j] = 1;
        }
    }
    back(1, team, 0);
    printf ("%d\n", nr);
    return 0;
}