回 帖 发 新 帖 刷新版面

主题:字符串的展开 (求解..)

在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子串,我们就把它当作一种简写,输出时,用连续递增的字母或数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下:
(1)遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。
(2)参数p1:展开方式。p1=1时,对于字母子串,填充小写字母;p1=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3时,不论是字母子串还是数字子串,都用与要填充的字母个数相同的星号“*”来填充。
(3)参数p2:填充字符的重复个数。p2=k表示同一个字符要连续填充k个。例如,当p2=3时,子串“d-h”应扩展为“deeefffgggh”。减号两侧的字符不变。
(4)参数p3:是否改为逆序:p3=1表示维持原有顺序,p3=2表示采用逆序输出,注意这时仍然不包括减号两端的字符。例如当p1=1、p2=2、p3=2时,子串“d-h”应扩展为“dggffeeh”。
(5)如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。
題目如上
我就是过不了  系统老是80分 ..  
有高人指点下么- -  

var
p1,p2,p3,i,j,h,v,s,t:integer; st:string;   g:boolean;
begin
assign(input,'expand.in');
assign(output,'expand.out');
reset(input);
rewrite(output);
readln(p1,p2,p3);
read(st);
v:=1;
for i:=1 to length(st) do
begin
s:=0;
t:=0;


  if st[i]='-' then
    if (i<>1) and (i<>length(st)) then
   begin
           write(copy(st,v,i-v));
         v:=i+1;
          for j:=48 to 57 do
             begin
          if ord(st[i-1])=j then s:=1;
           if ord(st[i+1])=j then t:=1;
               end;     (这里是我用來判断前后是否同是数字或字母)
                if (s+t=0) or (s+t=2) and( ord(st[i-1])<ord(st[i+1]) )then
           begin
              if p3=2 then
                for h:=ord(st[i+1])-1 downto ord(st[i-1])+1 do
                 for j:=1 to p2 do
                begin
               if p1=1 then
                write(chr(h));
                if p1=2 then
                write (upcase(chr(h))) ;
                 if p1=3 then
                  write('*');
                 end;

                  if p3=1 then
             for h:=ord(st[i-1])+1 to ord(st[i+1])-1  do
              for j:=1 to p2 do
               begin
              if p1=1 then
              write(chr(h));
              if p1=2 then
              write(upcase(chr(h)));
              if p1=3 then
               write('*');
                end;
          end;

      if ( (s+t=0) or (s+t=2)) and( ord(st[i-1])<ord(st[i+1]) ) then
      g:=true else g:=false;
         if g=false then write('-');              (沒有作出處理時加上'-')  
     end;
    end;

write(copy(st,v,length(st)-v+1)) ;
close(input);
close(output);
end.
要是有人有那些題目的測試数据更好- -  我过不了5,6測試点 ..

回复列表 (共1个回复)

沙发

uses crt;
var st:string;
    p1,p2,p3:byte;
procedure ff(st:string;p1,p2,p3:byte);
  var a,b:char;
      i,p:0..1000;
      f:string;
  begin
    a:=st[1];
    b:=st[3];
    if ord(a)>=ord(b) then begin f:=st;exit end;
    if ord(b)-ord(a)=1 then begin f:=concat(a,b);exit end;
    f[1]:=a;
    for i:=2 to 1+p2*(ord(b)-ord(a)) do
      if p1=3 then f[i]:='*' else begin
        p:=(i-2)div p2+1;
        if p3=2 then p:=ord(b)-ord(a)-p;
        f[i]:=upcase(chr(p+ord(a)));
        if (p1=1)and(f[i]>='A')and(f[i]<='Z') then f[i]:=chr(ord(f[i])+32);
      end;
    f[p2*(ord(b)-ord(a))]:=b;
    for i:=1 to p2*(ord(b)-ord(a)) do write(f[i]);
  end;
begin
  clrscr;
  readln(st);
  readln(p1,p2,p3);
  ff(st,p1,p2,p3);
  readln
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册