Cod sursa(job #514385)

Utilizator andra23Laura Draghici andra23 Data 18 decembrie 2010 16:19:52
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<fstream>
#include<iostream>
#define maxn 15

using namespace std;

int n, p[maxn], pm[maxn], mm[maxn];
int sub = -1, aux[maxn], result, s[maxn], set[maxn];
ofstream g("copii.out");

void verifica() {
    int cod = 1;
    for (int i = 0; i <= sub; i++) {
        if (mm[i] != ((1<<(sub+1)) - 1) ) {
            cod = 0;
            break;
        }
    }
    if (cod == 1) {
        result++; 
    } 
}

void back(int k);

void pune(int k, int i) {
    s[k] = i;   
    int a = set[i];
    int b = pm[i];
    int v[30];
    set[i] = set[i] | (1 << k);
    pm[i] = pm[i] | p[k];
    for (int j = 0; j <= sub; j++)
        v[j] = mm[j];
        
    for (int j = 0; j <= sub; j++) {
        if ((set[j] & p[k]) > 0) {
            mm[i] = mm[i] | (1 << j);    
        }   
        if ((pm[j] & (1 << k)) > 0) {
            mm[j] = mm[j] | (1 << i);   
        }
    }
    
    if (k == n-1) {
        if (sub >= 1)
            verifica();
    }
    else 
        back(k+1);
    
    set[i] = a;
    pm[i] = b;
    for (int j = 0; j <= sub; j++)
        mm[j] = v[j];
}

void back(int k) {
    for (int i = 0; i <= sub; i++) {
        pune(k, i);   
    }    
    
    sub++;
    pune(k, sub);
    sub--;
}

int main() {
    ifstream f("copii.in");   
    
    int i, j, x;
    char s[20];
    
    f >> n;
    
    for (i = 0; i < n; i++) {
        f >> s;
        int k = 1;
        for (j = 0; j <= n-1; j++) {
            x = s[j] - '0';
            p[i] += k*x;
            k = k<<1;    
        }    
    }
    
    for (i = 0; i <= n; i++) {
        mm[i] = mm[i] | (1<<i);  
    }
    
    back(0);

    g << result << '\n';
    
    return 0;
}