var
dic:array[1..2000] of char;
a:array[1..26] of char;
min,max,w,i,j:longint;
c:char;
procedure init;
var
i:longint;
begin
for i:=ord('a') to ord('z') do
dic[i]:=chr(i);
end;
procedure solve(x:longint);
var
i,j,k:longint;
begin
if x=6 then exit;
for i:=w downto 1 do
begin
if ord(a[i])=ord(dic[max])-(w-i) then
for k:=i-1 downto 1 do
if ord(a[k])<>ord(dic[max])-(w-k) then
begin
a[k]:=chr(ord(a[k])+1);
for j:=k+1 to w do
a[j]:=chr(ord(a[j-1])+1);
for j:=1 to w do
write(a[j]); writeln;
solve(x+1);
exit;
end
else begin end
else
begin
a[i]:=chr(ord(a[i])+1);
for j:=1 to w do
write(a[j]); writeln;
solve(x+1);
exit;
end;
end;
end;
begin
init;
readln(min,max,w);
min:=min+ord('a')-1;
max:=max+ord('a')-1;
for i:=1 to w do
begin
read(c);
a[i]:=c;
end;
solve(1);
end.
var s,t,w,n,i:integer; ch:array[1..26]of char;
procedure try(j,k:integer;c:char);
begin
if (ord(ch[j])+1-ord('a')>=k)and(j>1) then
begin
try(j-1,k-1,chr(ord(c)-1));
ch[j]:=chr(ord(ch[j-1])+1);
end
else ch[j]:=chr(ord(ch[j])+1);
end;
begin
readln(s,t,w);
for i:=1 to w do read(ch[i]);
n:=0;
while n<5 do
begin
inc(n);
try(w,t,chr(ord('a')+t-1));
if (ord(ch[1])+1-ord('a')>t-w+1) then break;
for i:=1 to w do write(ch[i]);
writeln;
end;
end.
仅供参考:
var
s,t,w,n,i:integer;
a:array[1..26]of char;
procedure try(j,k:integer;c:char);
begin
if (ord(a[j])+1-ord('a')>=k)and(j>1) then
begin
try(j-1,k-1,chr(ord(c)-1));
a[j]:=chr(ord(a[j-1])+1);
end
else a[j]:=chr(ord(a[j])+1);
end;
begin
readln(s,t,w);
for i:=1 to w do read(a[i]);
n:=0;
while n<5 do
begin
inc(n);
try(w,t,chr(ord('a')+t-1));
if (ord(a[1])+1-ord('a')>t-w+1) then break;
for i:=1 to w do write(a[i]);
writeln;
end;
end.
先用一个数组来存取每个位的最大字母,最大字母小于题目规定的就存取题目规定的最小字母
比如 题目的 2 10 5
b[5]=j ,b[4]=i,b[3]=h,b[2]=g ,b[1]=f
数组a用来存取字符串
如果你有看过组合算法的 这题不会很难。
程序如下:
program P3;
var
a,b:array [1..26] of char;
i,j,k,l,n,r,s:integer;
s1,s2,t:char;
begin
readln(r,n,l);
s1:=chr(ord('a')-1+r);
s2:=chr(ord('a')-1+n);
for i:=1 to l do
begin
read(a[i]);
if ord(s1)+1<=ord(s2)+1-i then
b[l+1-i]:=chr(ord(s2)+1-i)
else b[l+1-i]:=s1;
end;
k:=l;s:=0;
while (k<>0) and (s<5) do
if a[k]<b[k] then
begin
a[k]:=chr(ord(a[k])+1);
for k:=k+1 to l do a[k]:=chr(ord(a[k-1])+1);
for i:=1 to l do write(a[i]);
writeln;
inc(s);
end else dec(k);
end.