Documente Academic
Documente Profesional
Documente Cultură
Soluţie
Cea mai mică permutare din pdv lexicografic este 1, 2, ..., n (permutarea
identică).
Cea mai mare permutare din pdv lexicografic este n, n-1, ..., 2, 1.
Vom reprezenta permutarea ca un vector P cu n componente (1≤P[i]≤n,
P[i]≠P[j], 1≤i<j≤n).
Pentru a genera permutările vom utiliza un algoritm de tip succesor:
Pas 1. Iniţializăm vectorul P cu permutarea identică (P[i]=i, pentru orice
1≤i≤n)
Pas 2. Cât timp este posibil (mai există succesor)
afişăm permutarea curentă;
generăm permutarea următoare; în acest scop căutăm prima componentă
(începând din dreapta către stânga) care poate fi mărită (adică determinăm
cel mai mare i cu proprietatea că există un element P[j], astfel încât P[j]>P[i],
iar j>i); determin apoi cel mai mic element P[j] situat dupa P[i] care este
>P[i]; interschimb P[i] cu P[j], apoi elementele situate dupa pozitia i le
rearanjez astfel incat sa obtin cea mai mica configuratie posibila (adica in
ordine crescatoare).
ok←0;
cit timp ok=0
afisare;
i←n-1;
cit timp (i>=1) and (P[i]>P[i+1]) executa dec(i);
Sf cit timp
daca (i=0) atunci {ultima permutare}
ok←1
else
{maresc P[i] cu cel mai mic element situat dupa el}
begin
j←n;
cit timp P[j]<P[i] executa dec(j);
sf cit timp
aux←P[i];
P[i] ←P[j];
P[j] ←aux;
//inversez segmentul i+1..j
k:=i+1; j:=n;
cit timp k<j executa
• aux←P[k]; P[k] ←P[j]: P[j] ←aux;
inc(k); dec(j);
sf_cit timp
end
Cod de identificare
Pentru a concura cu numărul de serie de la procesoarele Intel Pentium III, Advanced Micro Devices a
stabilit un sistem de identificare pentru noile procesoare cu numele de cod Thunderbird. Fiecare firmă
distribuitoare primeşte o mulţime de litere (de exemplu {a, m, x}) din care va trebui să-şi formeze
codurile proprii de identificare. Firmelor li se impune exact de câte ori trebuie să apară fiecare literă în
aceste coduri. De exemplu, o firmă trebuie să formeze identificatori care să conţină exact 3 litere a, 2
litere m şi 1 literă x. Scrieţi un program care, cunoscând un anumit cod dat, determină următorul cod
corect în ordine lexicografică, dacă există un astfel de cod următor. (ONI Constanţa 2000, IX)
Date de intrare
Fişierul de intrare COD.IN conţine un cod. Codurile sunt formate din cel mult 100 de litere mici ale
alfabetului latin.
Date de ieşire
Fişierul de ieşire COD.OUT va conţine o singură linie pe care se va afla codul următor; dacă nu există
un astfel de cod, atunci în fişier se va scrie ‘Este ultimul cod.’
Exemple
COD.IN COD.OUT
amaaxm amamax
COD.IN COD.OUT
xmmaaa Este ultimul cod.