Sunteți pe pagina 1din 2

1.

Generarea permutrilor
Se citete un numr natural n. Se cere s se tipreasc toate permutrile mulimii {1,2,,n} n ordine
lexicografic. De exemplu, pentru n=3 avem
1 2 3, 1 3 2, 2 1 3, 2 3 1, 3 1 2, 3 2 1.
Definiie: Permutrile unei mulimi A cu n elemente reprezint toate modurile de aranjare a
elementelor mulimii A astfel nct fiecare element s fie scris o singur dat.
Reprezentarea soluiei: - fiecare component are valori n mulimea {1,2,.,n}
-soluia are n componente
Condiia de validare: - fiecare component apare o singur dat
Numrul permutrilor: n! = 1*2*...*n

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,nr;
void tipar()
{
int i;
for(i=1;i<=n;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==n) tipar();
else
{k=k+1;x[k]=0;}
}
k=k-1;
}
}
int main()
{
cin>>n;
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.

#include<iostream>
using namespace std;
int x[30];
int n,nr;
void tipar()
{
int i;
for(i=1;i<=n;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==n+1)tipar();
else
for(i=1;i<=n;i++)
{
x[k]=i;
if(valid(k)) back(k+1);
}
}
int main()
{
cin>>n;
back(1);
cout<<nr;
}

Varianta recursiv optimizat:


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.

#include<iostream>
using namespace std;
int x[30],s[30];
int n;
void tipar()
{
int i;
for(i=1;i<=n;i++)
cout<<x[i]<<' ';
cout<<'\n';
}
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==n+1) tipar();
else
for(i=1;i<=n;i++)
if(s[i]==0)
{
x[k]=i;s[i]=1;
back(k+1);
s[i]=0;
}
}
int main()
{
cin>>n;
back(1);
}

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