Được gửi bởi
takang
uhm đấy, có lời giải up cho mọi người thêm kiến thức.
Code:
program dao_day;
uses crt;
const
inp='inp2.txt';
out='out2.txt';
type
str=array[0..100] of char;
var
s: str;
f, g: text;
n: longint;
time: longint;
procedure nhap;
begin
assign(f,inp);
assign(g,out);
reset(f);
rewrite(g);
readln(f,n);
end;
procedure doc(var s: str);
var
i: integer;
begin
fillchar(s,sizeof(s),chr(0));
while not eoln(f) do
begin
s[0]:=chr(ord(s[0])+1);
read(f,s[ord(s[0])]);
end;
end;
procedure vietday(s: str);
var
i: word;
begin
for i:=1 to ord(s[0]) do write(s[i]);
end;
procedure quicksort(l, r: word);
var
i, j: word;
tg, tam: char;
begin
i:=l;
j:=r;
tg:=s[(l+r) div 2];
repeat
while ord(s[i])<ord(tg) do inc(i);
while ord(s[j])>ord(tg) do dec(j);
if i<=j then
begin
tam:=s[i];
s[i]:=s[j];
s[j]:=tam;
inc(i);
dec(j);
end;
until i>j;
if j>l then quicksort(l,j);
if i<r then quicksort(i,r);
end;
procedure sinh_hv(s: str);
var
vti, vtj, i, j: word;
stop: boolean;
tam: char;
begin
writeln(g);
vietday(s);
repeat
stop:=true;
for i:=ord(s[0]) downto 2 do
if s[i]>s[i-1] then
begin
vti:=i-1;
stop:=false;
for j:=ord(s[0]) downto vti+1 do
begin
if (ord(s[j])>ord(s[vti])) then
begin
vtj:=j;
break;
end;
end;
tam:=s[vtj];
s[vtj]:=s[vti];
s[vti]:=tam;
for j:=1 to ((ord(s[0])-(vti+1))+1) div 2 do
begin
tam:=s[vti+j];
s[vti+j]:=s[ord(s[0])-j+1];
s[ord(s[0])-j+1]:=tam;
end;
writeln;
vietday(s);
break;
end;
until stop;
end;
procedure xuly;
var
i: longint;
begin
for i:=1 to n do
begin
doc(s);
readln(f);
quicksort(1,ord(s[0]));
sinh_hv(s);
writeln(g);
end;
close(f);
close(g);
end;
begin
clrscr;
nhap;
xuly;
readln;
end.
Bookmarks