Cod sursa(job #1702180)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 14 mai 2016 17:34:29
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 11;

int n , i , j , teams , ans;
int v[nmax+10];
char A[nmax+10];

bool friends[(1<<nmax)+10][(1<<nmax)+10];

void updFriends(int lvl , int a , int b)
{
    if (lvl == n + 1)
    {
        friends[a][b] = 1;
        return;
    }

    if (lvl == i)
        updFriends(lvl + 1 , a ^ (1 << lvl) , b);
    else if (lvl == j)
        updFriends(lvl + 1 , a , b ^ (1 << lvl));
    else
    {
        updFriends(lvl + 1 , a , b);
        updFriends(lvl + 1 , a ^ (1 << lvl) , b);
        updFriends(lvl + 1 , a , b ^ (1 << lvl));
    }
}

bool ok(int pos)
{
    for (int i = 1; i < teams; ++i)
        for (int j = i + 1; j <= teams; ++j)
            if (!friends[v[i]][v[j]] || !friends[v[j]][v[i]])
                return 0;

    return 1;
}

void solve(int node)
{
    if (node > n)
    {
        if (teams >= 2 && ok(teams)) ans++;
        return;
    }

    /// bit 1 - se alatura la o echipa precedenta
    for (int i = 1; i <= teams; ++i)
    {
        v[i] ^= (1 << node);
        solve(node + 1);
        v[i] ^= (1 << node);
    }

    /// bit 0 - echipa noua

    v[++teams] = (1 << node);
    solve(node + 1);
    v[teams--] = 0;
}

int main()
{
    freopen("copii.in","r",stdin);
    freopen("copii.out","w",stdout);

    scanf("%d\n", &n);

    for (i = 1; i <= n; ++i)
        for (gets(A+1), j = 1; j <= n; ++j)
            if (A[j] == '1')
                updFriends(1 , 0 , 0);

    solve(1);
    printf("%d\n", ans);

    return 0;
}