电话号码

电话号码

源程序名            phone.???(pas, c, cpp)

可执行文件名        phone.exe

输入文件名          phone.in

输出文件名          phone.out

【问题描述】

       电话机上每一个数字下面都写了若干个英文字母。分布如下:

      1~abc

      2~def

      3~ghi

      4~jkl

      5~mn

      6~opq

      7~rst

      8~uvw

      9~xyz

      现在给定一个单词表和一串数字密码,请你用单词表中的单词翻译这个密码。

【输入】

       第一行为一个正整数N表示单词表中单词的个数(N≤100);

       第二行为一个长度不超过100的数字串,表示密码;

       接下来的N行,每行一个长度不超过20的单词,表示单词表。

【输出】

    仅一行,表示翻译后的原文,如果密码无法翻译,则输出“No Solutions!”,如果密码有多种翻译方式,则输出任意一种即可。

【样例】

       phone.in                              phone.out

       8                                        thi shs b boo k

       73373711664

       thi

       shs

       this

       is

       b

       a

       boo

       k

=====================

一个深搜就可以了.

主要方法:把每个单词转化成对应的数字串。搜索中在加个check,判断就行了.

=====================

 

const
  pho:array['a'..'z']of char=
  ('1','1','1','2','2','2','3','3','3','4','4','4','5','5','6','6','6','7','7','7','8','8','8','9','9','9');
 // a   b   c   d   e   f   g   h   i   j   k   l
var
  n,m:longint;
  num:array[1..100]of string;
  num_:array[1..100]of string;
  //f:array[1..100]of boolean;
  st:string;
  
procedure init;
begin
  assign(input,'phone.in');
  assign(output,'phone.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

function check(a:string;var b:string):boolean;
var
  i:longint;
begin
  check:=false;
  for i:=1 to n do
    if a=num_[i] then
      begin
        b:=num[i];
        exit(true);
      end;
end;

procedure dfs(t:longint;st_:string);
var
  i:longint;
  st__,st1:string;
begin
  if t=m+1 then
    begin
      for i:=1 to length(st_)-1 do
        write(st_[i]);
      terminate;
    end;
    
  st__:='';
  for i:=t to m do
    begin
      st__:=st__+st[i];
      if check(st__,st1) then
       begin
         dfs(i+1,st_+st1+' ');
       end;
    end;
end;

procedure main;
var
  i,j:longint;
begin
  readln(n);
  readln(st);
  m:=length(st);
  for i:=1 to n do
    begin
      readln(num[i]);
      num_[i]:='';
      for j:=1 to length(num[i]) do
        num_[i]:=num_[i]+pho[num[i][j]];
    end;
  //fillchar(f,sizeof(f),true);
  dfs(1,'');
  writeln('No Solutions!');
end;

begin
  init;
  main;
  terminate;
end.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值