Sunteți pe pagina 1din 1

2.

Generarea aranjamentelor
Se citesc dou numere naturale n i c, cu 1 c n. Se cere s se tipreasc toate aranjamentele de n
elemente luate cate c, n ordine lexicografic. De exemplu, pentru n=3 i c=2 avem
1 2, 1 3 , 2 1 , 2 3 , 3 1 , 3 2 .
Definiie: Fie A o mulime cu n elemente. Aranjamentele de n elemente luate cte c sunt toate
submulimile ordonate ale lui A care au fiecare cte c elemente.
Reprezentarea soluiei: - fiecare component are valori n mulimea {1,2,.,n}
-soluia are c componente
Condiia de validare: - fiecare component apare o singur dat
Numrul aranjamentelor:

Varianta iterativ
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.

#include<iostream>
using namespace std;
int x[30];
int n,c,nr;
void tipar()
{
int i;
for(i=1;i<=c;i++)
cout<<x[i]<<' ';
cout<<'\n';
nr++;
}
int valid(int k)
{
int i;
for(i=1;i<k;i++)
if(x[i]==x[k])return 0;
return 1;
}
void back()
{
int i,k=1;
x[1]=0;
while(k>0)//stiva nu este vida
{
while(x[k]<n)
{
x[k]=x[k]+1;
if(valid(k))
if(k==c) tipar();
else{k=k+1;x[k]=0;}
}
k=k-1;
}
}
int main()
{
cin>>n;
cin>>c;
back();
cout<<nr;
}

Varianta recursiv
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.

#include<iostream>
using namespace std;
int x[30];
int n,c,nr;
void tipar()
{
int i;
for(i=1;i<=c;i++)
cout<<x[i]<<' ';
cout<<'\n';
nr++;
}
int valid(int k)
{
int i;
for(i=1;i<k;i++)
if(x[i]==x[k])return 0;
return 1;
}
void back(int k)
{
int i;
if(k==c+1)tipar();
else
for(i=1;i<=n;i++)
{
x[k]=i;
if(valid(k)) back(k+1);
}
}
int main()
{
cin>>n;
cin>>c;
back(1);
cout<<nr;
}

S-ar putea să vă placă și