电话号码
源程序名 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.