Cod sursa(job #2475797)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 17 octombrie 2019 16:44:21
Problema Copii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <vector>
#define nmax 12
using namespace std;
char v[nmax][nmax];
vector <int> g[nmax];
int n, grup[nmax], sol;


void bkt(int k, int p)
{
    if (k <= n) {
        int i;
        for (i = 1; i <= p; i++) {
            g[i].push_back(k);
            grup[k] = i;

            bkt(k + 1, p);

            grup[k] = 0;
            g[i].erase(g[i].end() - 1);
        }
        g[p + 1].push_back(k);
        grup[k] = p + 1;

        bkt(k + 1, p + 1);

        grup[k] = 0;
        g[p + 1].clear();

        return;
    }
    if (p == 1)
        return;
    int r[nmax][nmax] = {0};
    int i, j;

/*
    printf("\n");
    for (i = 1; i <= p; i++) {
        for (j = 0; j < g[i].size(); j++)
            printf("%d ", g[i][j]);
        printf("\n");
    }
*/
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            if (v[i][j] == '1')
                r[grup[i]][grup[j]] = 1;

    for (i = 1; i <= p; i++)
        for (j = 1; j <= p; j++)
            if (i != j && r[i][j] == 0)
                return;

                /*
    printf("This is a solution\n");
    for (i = 1; i <= p; i++) {
        for (j = 0; j < g[i].size(); j++)
            printf("%d ", g[i][j]);
        printf("\n");
    }*/

    sol ++;
}
int main()
{
    int i;
    freopen("copii.in","r",stdin);
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
        scanf("%s", v[i] + 1);

    bkt(1, 0);

    freopen("copii.out","w",stdout);
    printf("%d\n", sol);

    return 0;
}