Cod sursa(job #421876)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 21 martie 2010 19:59:08
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <cassert>
#include <cstring>
#include <algorithm>

using namespace std;

#define MAXN 10

int N; char m[MAXN][MAXN], ok[MAXN][MAXN];
int st[MAXN];

int NR = 0;

inline void back(int k, int Max = 0) {
    if (k == N) {
        if (Max == 1) {
            return;
        }

        memset(ok, 0, sizeof(ok));
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (m[i][j]) {
                    ok[st[i]][st[j]] = 1;
                }
            }
        }
        for (int i = 1; i <= Max; i++) {
            for (int j = 1; j <= Max; j++) {
                if (i != j && !ok[i][j]) {
                    return;
                }
            }
        }
        NR += 1;
        return;
    }

    for (int i = 1; i <= Max + 1; i++) {
        st[k] = i;
        back(k + 1, max(Max, i));
    }
}

int main() {
    freopen("copii.in", "rt", stdin);
#ifndef DEBUG
    freopen("copii.out", "wt", stdout);
#endif

    assert(scanf("%d", &N) == 1);
    assert(1 <= N && N <= MAXN);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            assert(scanf(" %c", m[i] + j));
            assert(m[i][j] == '0' || m[i][j] == '1');
            m[i][j] -= '0';
        }
    }

    back(0);
    printf("%d\n", NR);

    return 0;
}