Pagini recente » Cod sursa (job #2490013) | Cod sursa (job #2242436) | Cod sursa (job #2384919) | Cod sursa (job #1426559) | Cod sursa (job #1424904)
#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;
for( i = 0 ; i < k ; i ++)
if (v[i] == v[k])
{
ev = false;
break;
}
for( i = 1 ; i <= k ; i ++)
if (v[i-1]>=v[i]) //punem asta pentru combinari si merge
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)
{
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;
}