Cod sursa(job #1424908)

Utilizator sulzandreiandrei sulzandrei Data 25 aprilie 2015 20:22:54
Problema Combinari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.41 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("combinari.in");
ofstream out("combinari.out");
bool as,ev; int n,k,p;
void valid(int k, int v[],bool &ev)//aici vedem daca solutia ce contine primele k elemente in vectoru v este corect
{
    int i;
    ev = true;
    if( k>0 && v[k]<=v[k-1])
        ev = false;
}
void init( int k, int v[])//aici initalizam elementul de pe pozitia k cu valoarea precedenta valori minime a unui element din solutie adik 1-1=0
{
    v[k] = 0;
}
void suc(int k, int v[], bool &as)//aici vedem daca pe pozitia k mai exista un succesor(o valoare posibila) pentru in vectorul v si daca da o luam
{
    if( v[k]< n-p+k+1)
    {
        v[k]++;
        as = true;
    }
    else
        as = false;

}
void tipar(int k, int v[])//aici afisam vectorul ce contine solutia
{
    int i;
    for(i = 0 ; i < p; i ++)//punem p in loc de n pt aranj de n cate p
        out << v[i] <<" ";
    out<<"\n";
}
bool solutie(int k)//functia solutie ne spune daca lungimea vectorului solutiei este corecta
{
    if(k == p-1)//pentru aranjamente de n cate p putem p-1 in loc de n-1
        return true;
    return false;
}
int main()
{
    in >> n >> p;
    int v[n];
    k = 0;
    init(k,v);
    while( k>-1 )//cat timp avem elemente pe care le putem verifica in vectoru v
    {
        do//aici cat timp avem solutie pe pozitia k din vector si inca nu e valida
        {
            suc(k,v,as);// in cazul in care pe pozitia k urmatoarea valoarea e corecta atunci o acceptam si facem as = true
            //altfel nu e posibila o noua val si facem as = false
            if(as)//daca a fost acceptata o noua valoarea pe pozitia k vedem daka e valida pentru solutie
                valid(k,v,ev);
        }
        while( as  && !(as && ev));//deci ne oprim cand ori nu am gasit o valoarea posibila pe positia k ori am gasit si respecta conditiile
        if (as)//daca am gasit valoarea posibila pe pozitia k inseamna ca trebuie sa testam daca pozitia k este si finala
            if(solutie(k))//daca k e finala atunci doar afisam solutia
                tipar(k,v);
            else//altfel vedem solutia posibila pe urmatoarea valoare din vector
            {
                k++;
                init(k,v);
            }
        else//altfel ne intoarcem cu un pas inapoi pentru a marii valoare posibila pe acea pozitie
            k--;
    }
    return 0;
}