Generarea produsului cartezian
Se consideră n mulţimi A1, A2, … , An de forma {1,2..,an}. Să se genereze produsul cartezian al acestor mulţimi.
Am considerat mulţimile de forma {1,2..,an} pentru a simplifica problema, în special la partea de citire si afişare, algoritmul de generare rămânând nemodificat.
Identificăm următoarele particularităţi şi condiţii:
Fiecare element Xk din vectorul soluţie aparţine unei mulţimi {1,2..,ak}. Aici este o diferenţă faţă de algoritmii anteriori în care fiecare element din soluţie era luat din aceeaşi mulţime şi trebuie să avem grijă la acest fapt când scriem programul.
Nu există condiţii între elementele vectorului soluţie.
Obţinem soluţia când s-au generat n valori.
ENUNT: Fie n numar natural nenul si A1, A2, ... An n multimi cu L1, L2, .... Ln elemente. Scrieti un program de generare a elementelor produsului cartezian A1 x A2 x A3 x ... x An
EXEMPLU: Pentru n=3 si L=(1,2,3) programul va genera
{1 1 1}
{1 1 2}
{1 1 3}
{1 2 1}
{1 2 2}
{1 2 3}
SOLUTIE:
Solutia x[1]......x[n]. Elementul x[i] va avea ca valoare un element al multimii Ai.
x[k] poate avea ca valoare orice valoare din intervalul [1,Lk].
Valid - nu este necesar
PROGRAM C++:
#include <iostream>
using namespace std;
char sp4[]=" ";
int x4[20], n4, nrsol4=0, a[20];
void Afisare4()
{ int i,j;
cout<<sp4;
for(i=1;i<=n4;i++) cout<<x4[i]<<" ";
cout<<endl;
nrsol4++;
}
void BackRec4(int k)
{ int i;
for(i=1;i<=a[k];i++)
{ x4[k]=i;
if (k==n4) Afisare4();
else BackRec4(k+1);
}
}
int main()
{ int i;
cout<<endl<<endl<<sp4<<"Produsul cartezian a n multimi de cardinal a1, a2, ... an"<<endl;
cout<<endl<<sp4<<" Dati valoarea lui n: "; cin>>n4;
cout<<endl<<sp4<<" Dati cardinalul fiecarei multimi: "<<endl<<endl;
for (i=1;i<=n4;i++)
{ cout<<sp4<<" Multimea "<<i<<": "; cin>>a[i];}
BackRec4(1);
cout<<endl<<sp4<<"Numar solutii: "<<nrsol4;
return 0;
}