Cod sursa(job #2477273)

Utilizator alexnigaNiga Alexandru alexniga Data 19 octombrie 2019 21:57:33
Problema Copii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("copii.in");
ofstream g("copii.out");

int calcu = 0, FinalResult = 0;

vector <int> viz(15, 0);
vector <int> groups(15);
vector<vector<int> > M(15, vector<int>(15));

void CheckIfGood(int maxx, int n)
{
    //cout << maxx << " ";
    int ok = 1;
    int i, j;
    bool m[16][16] = {0};

    for ( i = 0; i < maxx ; i++ )
        for ( j = 0; j < maxx; j++ )
            m[i][j] = 0;

    for ( i = 0; i < n ; i++ )
        for ( j = 0; j < n; j++ )
            if (M[i][j])
                m[groups[i]][groups[j]] = 1;

    for (  i = 0; i < maxx; i++)
        for ( j = 0; j < maxx; j++)
            if (i != j && !m[i][j])
            {
                //cout << i << " " << j;
                return;
            }
    if (maxx != 1)
        FinalResult++;
}

void BackGroups(int k, int n, int maxx)
{
    //cout << k;
    if (k == n)
    {
        //    for (int i = 0; i < n; i++)
        //          cout << groups[i] << " ";
//        cout <<"\n";

        CheckIfGood(maxx, n);
        return;
    }
    for (int i = 0; i <= maxx; i++)
    {
        //cout << i;
        groups[k] = i;
        int max_1;
        if (i >= maxx)
            max_1 = i + 1;
        else
            max_1 = maxx;

        BackGroups(k + 1, n, max_1);

    }

}

int main()
{
    int N, maxx = 0;

    f >> N;

    for (int i = 0; i < N; i++)
    {
        int local;
        f >> local;
        for (int j = N - 1; j >= 0; j--)
        {
            M[i][j] = local % 10;
            local /= 10;
        }
    }
    BackGroups(0, N,maxx);

    g << FinalResult;
    //cout << FinalResult;

    return 0;
}