usaco1.2 namenum 2008.11.5

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: namenum
LANG: 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值