Cod sursa(job #1200338)

Utilizator Bursucelthe coppice Bursucel Data 22 iunie 2014 11:01:26
Problema Generare de permutari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#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
*/