QBHV - Hoán vị chữ cái

Tác giả: RR

Ngôn ngữ: Pascal

var
  cnt:longint;
  a:string;

function find:longint;
    var
      i:longint;
    begin
      for i:=length(a)-1 downto 1 do
        if a[i]<a[i+1] then exit(i);
      exit(0);
    end;

procedure sort(start,last:longint);
    var
      i,j:longint;
      tmp:char;
    begin
      for i:=start to last-1 do
      for j:=i+1 to last do
      if a[j]<a[i] then
        begin
          tmp:=a[i];
          a[i]:=a[j];
          a[j]:=tmp;
        end;
    end;

procedure gen(print:boolean);
    var
      i,j,ln:longint;
      tmp,c:char;
    begin
      i:=find;
      cnt:=1; if print then writeln(a);
      while i<>0 do
        begin
          ln:=i;
          for j:=i to length(a) do
            if (a[j]>a[i]) and ((a[j]<a[ln]) or (ln=i)) then ln:=j;

          tmp:=a[ln]; a[ln]:=a[i]; a[i]:=tmp;
          sort(i+1,length(a));
          i:=find;
          inc(cnt); if print then writeln(a);
        end;
    end;

begin
  readln(a);
  sort(1,length(a));

  gen(false);
  writeln(cnt);
  sort(1,length(a));
  gen(true);
end.

Download