【递归与递推】电话号码

【递归与递推】电话号码

题目描述

电话机上每一个数字下面都写了若干个英文字母。分布如下:
      1~abc
      2~def
      3~ghi
      4~ikl
      5~mn
      6~opq
      7~rst
      8~uvw
      9~xyz
 现在给定一个单词表和一串数字密码,请你用单词表中的单词翻译这个密码。

输入

第一行为一个正整数N表示单词表中单词的个数(N≤100);
第二行为一个长度不超过100的数字串,表示密码;
接下来的N行,每行一个长度不超过20的单词,表示单词表。

输出

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

样例输入

8
73373711664
thi
shs
this
is
b
a
boo
k

样例输出

thi shs b boo k

分析:
先把单词映射到数字,再暴力匹配即可
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=1e2+10;
const int dis[][2]={0,1,-1,0,0,-1,1,0};
using namespace std;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;}
string a[maxn],f,b[maxn];
int len[maxn],len1,n;
string check(string a,int l)
{
    string p;
    for(int i=0;i<l;i++)
    {
        if(a[i]=='a'||a[i]=='b'||a[i]=='c')p+='1';
        else if(a[i]=='d'||a[i]=='e'||a[i]=='f')p+='2';
        else if(a[i]=='g'||a[i]=='h'||a[i]=='i')p+='3';
        else if(a[i]=='j'||a[i]=='k'||a[i]=='l')p+='4';
        else if(a[i]=='m'||a[i]=='n')p+='5';
        else if(a[i]=='p'||a[i]=='q'||a[i]=='o')p+='6';
        else if(a[i]=='r'||a[i]=='s'||a[i]=='t')p+='7';
        else if(a[i]=='u'||a[i]=='v'||a[i]=='w')p+='8';
        else if(a[i]=='x'||a[i]=='y'||a[i]=='z')p+='9';
    }
    return p;
}
void dfs(int now,string ans)
{
    if(now==len1){cout<<ans.substr(1,ans.length()-1)<<endl;exit(0);}
    else
    {
        for(int i=0;i<n;i++)if(now+len[i]<=len1&&b[i]==f.substr(now,len[i]))dfs(now+len[i],ans+" "+a[i]);
        return;
    }
}
int main()
{
    int i,j,m,k,t;
    scanf("%d",&n);
    cin>>f;len1=f.length();
    rep(i,0,n-1)cin>>a[i],len[i]=a[i].length(),b[i]=check(a[i],len[i]);
    dfs(0,"");
    puts("No Solutions!");
    //system("pause");
    return 0;
}

 



posted @ 2016-07-05 23:43  mxzf0213  阅读(337)  评论(0编辑  收藏  举报