usaco1.2 namenum 2008.11.5

来源:互联网 发布:163邮箱smtp ssl 端口 编辑:程序博客网 时间:2024/06/05 20:46

usaco1.2 namenum 2008.11.5

{Tips:

1.对字典序的理解错误:eg:ABC ABU ACE 第二位是B时,第三位从小到大都排完后,第二位才排C。我理解错了。我以为是前面的字符串的每一位都大于后面字符串的相应位,这种理解是错误的。要注意读题的准确

2.用了一个滚动数组,循环来纪录每次筛选的字符串。

3.要求找出所有符合条件的结果,我只找出了一组就跳出循环了。

4.存储每个数字代表哪个字母时,借鉴了结题报告,又有所改进。

5.从第一位开始筛选,如果不符合相应的条件,直接筛掉,不再进行接下来的处理

6.文件名打错了,‘namenum.out我打成了‘namenum.out;’多了个分号,一直出错 }


{ID: PROG: namenumLANG: PASCAL} program kakashi; const   x:array[2..9,1..3]of char=(('A','B','C'),('D','E','F'),('G','H','I'),('J',   'K','L'),('M','N','O'),('P','R','S'),('T','U','V'),('W','X','Y'));   y:array['0'..'9']of 0..9=(0,1,2,3,4,5,6,7,8,9);   type  arr=array[1..12]of 0..9;   var     f1,f2,ff:text;     r,i,j,n,la,lb,k,mm,m:longint;     t:arr;     l:integer;     flag,sign:boolean;     ch,answer,p:string;     z:array[0..1,1..5000]of string;   procedure deal(dep,m:longint);     var       l1,l2,o:longint;       begin     if (dep=l+1) then        begin        if m=0 then writeln(f2,'NONE') else         for o:=1 to m do         writeln(f2,z[k,o]);          exit;        end;        mm:=0;       for r:=1 to m do         if (z[k,r,dep]in[x[t[dep],1],x[t[dep],2],x[t[dep],3]])         then begin                inc(mm);                 z[1-k,mm]:=z[k,r];                end;           k:=1-k;           deal(dep+1,mm);   end;   begin     assign(f1,'namenum.in');     reset(f1);     assign(f2,'namenum.out');     rewrite(f2);     assign(ff,'dict.txt');     reset(ff);     readln(f1,p);     l:=length(p);     for i:=1 to l do      t[i]:=y[p[i]];     n:=0;     repeat       readln(ff,ch);       flag:=true;       if (length(ch)=l) then          if (ch[1] in[x[t[1],1],x[t[1],2],x[t[1],3]])then         begin          inc(n);          z[1,n]:=ch;         end;     until((eof(ff))or(ch[1]>x[t[1],3]));     k:=1;     deal(2,n);       close(f1);       close(f2);       close(ff);     end.


0 0
原创粉丝点击