Cod sursa(job #1977842)

Utilizator giotoPopescu Ioan gioto Data 6 mai 2017 12:12:54
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <vector>
using namespace std;

int n;
int f[13];
int Sol, f2[13][13], a[13][13];
char s[13];
int v[13][13];
inline void back(int k, int c){
    if(c == n){
        if(k == 1) return ;
        for(int i = 1; i <= k ; ++i)
        for(int j = 0; j <= n ; ++j)
        f2[i][j] = 0;
        for(int i = 1; i <= k ; ++i){
            for(int j = 1; j <= a[i][0] ; ++j){
                for(int t = 1; t <= v[a[i][j]][0] ; ++t){
                    if(f[v[a[i][j]][t]] == i) continue ;
                    f2[i][0] = f2[i][0] + 1 - f2[i][f[v[a[i][j]][t]]];
                    f2[i][f[v[a[i][j]][t]]] = 1;
                }
            }
            if(f2[i][0] < k - 1) return ;
        }
        ++Sol;
        return ;
    }
    for(int i = 1; i <= k ; ++i){
        a[i][++a[i][0]] = c + 1;
        f[c + 1] = i;
        back(k, c + 1);
        --a[i][0];
    }
    a[k + 1][++a[k + 1][0]] = c + 1;
    f[c + 1] = k + 1;
    back(k + 1, c + 1);
    --a[k + 1][0];
}
int main(){
    freopen("copii.in", "r", stdin);
    freopen("copii.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n ; ++i){
        scanf("%s", s);
        for(int j = 0; j < n ; ++j)
            if(s[j] == '1') v[i][++v[i][0]] = j + 1;
    }
    a[1][1] = 1;
    a[1][0] = 1;
    f[1] = 1;
    back(1, 1);
    printf("%d", Sol);
    return 0;
}