(* * * jmeno: nxtperm * * popis: nasledujici permutace * * zadani: * K zadane permutaci naleznete nasledujici v lexikografickem * usporadani, napr. pro P=5: 1 2 4 5 3 --> 1 2 5 3 4 . * Pozn: naslednik k posledni permutaci je prvni permutace. * * level: 3 * * input: * Radek vstupu vypada nasledovne: *. Z: N a1 a2 ... aN * kde Z cislo zadani, N je velikost permutace a a1 .. aN * je samotna permutace. Muzete prepokladat: N <= 100 * posledni zadani ma cislo 0. * * output: *. Z: lexikograficky nasledujici permutace oddelena mezerami * * soubory: * nxtperm.pas, nxtperm.in, nxtperm.out * * au: vitas@popelka.ms.mff.cuni.cz * cp: gpl * *) var Z: Integer; dt: Char; N: Integer; a: array [1..100] of Integer; tmp, i, j: Integer; begin repeat read (Z, dt, dt); { nacti } read(N); for i := 1 to N do read(a[i]); if N = 1 then begin { trivku vyresime taky trivialne } writeln(a[1],' '); continue; end; { odzadu: najdi rostouci usek } i := N - 1; while (a[i] > a[i + 1]) do begin Dec(i); if i = 0 then break; end; { a[i] je prvni poruseni rostouci } if i > 0 then begin { a[i] je nyni prni nemotoni prvek } j := N; { nalezeni nejblizsiho vestiho nez a[i] } while (a[i] > a[j]) do Dec(j); {prohodime } tmp := a[i]; a[i] := a[j]; a[j] := tmp; end; { otocit poradi prvku a[i+1] ... a[N] } i := i + 1; j := N; while i < j do begin tmp := a[i]; a[i] := a[j]; a[j] := tmp; Inc(i); Dec(j); end; {* tisk (aby se nevytisla ' ' za poslednim (a * zaroven odradkovani) *} write(Z, ':'); for i := 1 to N do write(' ',a[i]); { a dalsi zadani ... } until Z = 0; end.