Cod sursa(job #2477012)

Utilizator alexnigaNiga Alexandru alexniga Data 19 octombrie 2019 15:04:23
Problema Copii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

int calcu = 0, FinalResult = 0;

void CheckIfGood(int maxx, int n, vector <int>groups, vector<vector<int> > M)
{
    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])
                return;
    if (maxx != 1)
        FinalResult++;
}

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

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

        }
    }
}

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

    f >> N;
    vector <int> viz(N, 0);
    vector <int> groups(N);
    vector<vector<int> > M(N, vector<int>(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;
        }
    }
    /*   for (int i = 0; i < N; i++)
       {
           for (int j = 0; j < N; j++)
               cout << M[i][j] << " ";
           cout << "\n";
       }
    */
    BackGroups(0, N, groups, maxx, M);

    g << FinalResult;

    return 0;
}