Cod sursa(job #1447815)

Utilizator akaprosAna Kapros akapros Data 5 iunie 2015 14:15:39
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define Nmax 15
using namespace std;
int n, i, j, nr, w[Nmax], sol, cm;
int v[Nmax];
int a[Nmax][Nmax];
char s[Nmax];
int incsol(int nr)
{
    int i, j;
    if (nr == 1)
    return 0;
    for (i = 1; i <= nr; ++ i)
        {
            memset(w, 0, sizeof(w));

            w[i] = 1;
            cm = 0;
            for (j = 1; j <= n; ++ j)

                if (v[j] == i)
                {
                    for (int k = 1; k <= n; ++ k)
                    if (a[j][k] == 1 && !w[v[k]])
                       w[v[k]] = 1,
                       ++ cm;

                }
            for (j = 1; j <= nr; ++ j)
                if (!w[j])
                   cm = 0;
            if (cm != nr - 1)
            return 0;

        }
    return 1;

}
void Back(int k, int nr)
{
    if (k == n + 1)
        sol += incsol(nr);
    else
    {
        for (int i = 1; i <= nr + 1; ++ i)
        {
            v[k] = i;
            if (i == nr + 1) Back(k + 1, nr + 1);
               else Back(k + 1, nr);
            v[k] = 0;
        }
    }
}
int main()
{
    freopen("copii.in", "r", stdin);
    freopen("copii.out", "w", stdout);
    scanf("%d\n", &n);
    for (i = 1; i <= n; ++ i)
            {
                gets(s + 1);
                for (j = 1; j <= n; ++ j)
                a[i][j] = s[j] - '0';
            }
    Back(1, 0);
    printf("%d", sol);
    return 0;
}