讨论 / Jam 的计数法
598066456 2011-08-30 10:31:00
点我顶贴 收藏 删除
Jam 的计数法

急求!

#1 Mine_浅蓝@2010-04-08 03:37:00
回复 删除
SOFA!!!

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.

#2 Mine_ysd@2010-04-08 03:48:00
回复 删除
Jam 的计数法

没想到ZCC这么低智商...............

哎~无语.

#3 慈溪三小@2010-04-08 22:02:00
回复 删除
仅供参考:

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.

#4 hrbzsx@2010-04-08 23:16:00
回复 删除
仅供参考

仅供参考:

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.

#5 chenke@2011-08-30 06:07:00
回复 删除
解释一下

这是什么意思,解释一下,大牛!!!!!!!!!!!!!!!!!!!!

#6 ya88hu@2011-08-30 10:31:00
回复 删除
模拟一下就可以了

先用一个数组来存取每个位的最大字母,最大字母小于题目规定的就存取题目规定的最小字母

比如 题目的 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.

查看更多回复
提交回复