Cod sursa(job #1447812)

Utilizator akaprosAna Kapros akapros Data 5 iunie 2015 13:43:05
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define Nmax 12
using namespace std;
int n, i, j, nr, w[Nmax], sol, Sol, cm;
int v[Nmax];
bool a[Nmax][Nmax];
char s[Nmax];
void incsol()
{
    int i, j;
    ++ sol;
    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)
               {
                   -- sol;
                   break;
               }

        }

}
void Back(int k)
{
    if (k == n + 1)
        incsol();
    else
    {
        for (int i = 1; i <= nr; ++ i)
        {
            v[k] = i;
            Back(k + 1);
            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';
            }
    for (nr = 2; nr <= n; ++ nr)
    {
        sol = 0;
        Back(1);
        Sol = Sol + (sol / nr);
    }
    printf("%d", Sol);
    return 0;
}