Cod sursa(job #1216393)

Utilizator ZenusTudor Costin Razvan Zenus Data 4 august 2014 15:04:26
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define NMAX 20

char V[NMAX][NMAX];
int N,current,i,j,ans;
int equip[NMAX];

bool passed()
{
    if (equip[0]<=1)
    return false;

    bool current[NMAX][NMAX];
    memset(current,false,sizeof(current));

    for (int i=1;i<=N;++i)
    for (int j=1;j<=N;++j)
    if (V[i][j]=='1')
    current[equip[i]][equip[j]]=true;

    for (int i=1;i<=equip[0];++i)
    for (int j=1;j<=equip[0];++j)
    if (!current[i][j] && i!=j)
    return false;

    return true;
}

void back(int step)
{
    if (step>N)
    {
        if (passed())
        ++ans;

        return ;
    }

    for (int i=1;i<=equip[0];++i)
    {
        equip[step]=i;
        back(step+1);
    }

    ++equip[0];
    equip[step]=equip[0];
    back(step+1);
    --equip[0];
}

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

for (i=1,scanf("%d\n",&N);i<=N;++i,scanf("\n"))
for (j=1;j<=N;++j)
scanf("%c",&V[i][j]);

back(1);

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

return 0;
}