Pagini recente » Cod sursa (job #297996) | Cod sursa (job #54335) | Cod sursa (job #635138) | Cod sursa (job #414756) | Cod sursa (job #1200338)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("permutari.in"); ofstream g("permutari.out");
int n,w=1,p[9];
void genera()
{ int i,j;
for(i=1;i<=n;i++) p[i]=i;
while(w)
{ for(i=1;i<=n;i++) g<<p[i]<<" ";
g<<"\n";
i=n-1;
while(1<=i && p[i]>p[i+1]) i--;
w=i;
if(w)
{ j=n;
while(p[j]<=p[i]) j--;
p[i]^=p[j]^=p[i]^=p[j];
reverse(p+i+1,p+n+1);
}
}
}
int main()
{ f>>n;
genera();
g.close();
return 0;
}
/*
O idee alternativa este generarea iterativa.
O scurta descriere :
Fie p[1],p[2],...p[n] o permutare data.
1. Se cauta din coada prima pozitie de crestere adica adica
p[ i ]<p[ i+1 ] ( 1<= i < n ) i=maxim
2. Se cauta din coada prima pozitie j pentru care in care p[ j ] > p[ i ] .
3. Se schimba intre ele elementele din pozitiile i si j .
4. Se reverseaza secventa i+1 -> n.
Astfel se genereaza permutarea urmatoare in ordine lexicografica
*/