Cod sursa(job #1325442)

Utilizator niculescuteodorNiculescu Teodor Vicentiu niculescuteodor Data 23 ianuarie 2015 22:15:44
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int posibilitati, matrice[101][101], n,k,as,se,v[101],gasite[101][101];

void citire ()
{
    int i,j;
    char rand [101];
    f>>n;
    f.get ();
    for (i=1;i<=n;i++)
    {
        f.getline (rand,101);
        for (j=1;j<=n;j++)
        matrice [i][j] = rand [j-1]-'0';
    }
    for (i=1;i<=n;i++)
        matrice [i][i]=1;
}

void init ()
{
    v[k]=0;
}

int validare1 ()
{
    if (v[k]<v[k-1]+1)
    {
        v[k]++;
        return 1;
    }
    return 0;
}

int validare2 ()
{
    return 1;
}

int verificare ()
{
    if (k==n)
        return 1; return 0;
}

void afisare ()
{
        int maxim =0,i,j;
        for (i=1;i<=n;i++)
        {
            if (v[i] > maxim)
            maxim = v[i];
            for (j=1;j<=n;j++)
                if (matrice [i][j]==1)
                    gasite [v[i]][v[j]]=1;
        }
        for (i=1;i<=maxim;i++)
            for (j=1;j<=maxim;j++)
            if (gasite [i][j]==0)
        {
            for (i=1;i<=maxim;i++)
            for (j=1;j<=maxim;j++)
                gasite [i][j]=0;
            return ;
        }
        for (i=1;i<=maxim;i++)
            for (j=1;j<=maxim;j++)
                gasite [i][j]=0;
        posibilitati ++;
}

void backtracking ()
{
    k=1;
    init ();
    while (k>0)
    {
        as=1;
        se=0;
        while (as && !se)
        {
            as=validare1 ();
            if (as)
                se = validare2 ();
        }
        if (as)
            if (verificare ())
                afisare ();
        else
        {
            k++;
            init ();
        }
        else
            k--;
    }
}

int main()
{
    citire ();
    backtracking ();
    g << posibilitati-1 ;
    return 0;
}