Problema nu se rezolva cu permutari ci cu produs cartezian. Tu ai 3 multimi: S-multimea subiectelor, P-multimea predicatelor si C-multimea complementelor. Tu trebuie sa generezi toate triplele de forma (a,b,c) cu a apartine S, b apartine P si c apartine C.
Acum, cum faci back-ul? Ceva de genu:
back(nivel)
{
if(nivel==4) //am pus si subiect si predicat si complement
afisare();
else
{
for ( int i = 1; i <= M[ nivel ][ 0 ]; i++ ) //M[nivel][0] = cardinalul multimii M[nivel], multime in care stochezi cele 3 multimi S,P,C; ai un masiv 3-dimensional unde stochezi sirurile
{
st[ nivel ] = M[ nivel ][ i ];
back(nivel+1);
}
}
}
Daca nu iti iese sau ai nevoie de ajutor la ceva...sa-mi spui. Bafta!