递归与递推电话号码

Posted mxzf0213

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归与递推电话号码相关的知识,希望对你有一定的参考价值。

【递归与递推】电话号码

题目描述

电话机上每一个数字下面都写了若干个英文字母。分布如下:
      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;
}

 



以上是关于递归与递推电话号码的主要内容,如果未能解决你的问题,请参考以下文章

递归与递推一

递归与递推一

推箱子,递归与递推

递归与递推排序集合

递归与递推编码

递归与递推集合的划分