题意:输入一串数字(n个),产生3^n 个可能的名字 ,若该名字存在于dict.txt 文件中,则输入该名字(若多个,按字典序输出);若不存在,输出“NONE”
2: A,B,C 5: J,K,L 8: T,U,V
3: D,E,F 6: M,N,O 9: W,X,Y
4: G,H,I 7: P,R,S
题解:
有数字串推出的名字可能情况很多,逐个与字典比较时间复杂度高,所以逆向考虑将字典中名字串转化为数字串再匹配。
细节:
没有Q
dict.txt中 已经按字典序排列,所以输出不需要再考虑
/*
ID:jsntrdy1
PROG: namenum
LANG: C++
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
ifstream fin2("dict.txt");
ifstream fin("namenum.in");
ofstream fout("namenum.out");
//2: A,B,C 5: J,K,L 8: T,U,V
//3: D,E,F 6: M,N,O 9: W,X,Y
//4: G,H,I 7: P,R,S
char key[]={'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','0','7','7','8','8','8','9','9','9'};
string str;//输入数字 当成字符串 ;便于匹配
int main()
{
fin>>str;
int n=str.length();
string s;
bool flag=false;
while(fin2>>s)
{
//长度不同,跳过
if(s.length()!=n)
continue;
string temp="";//字符串尾部添加方便
for(int i=0;i<n;i++)
{
temp+=key[s[i]-'A'];
}
if(temp==str)
{
flag=true;
fout<<s<<endl;
}
}
if(!flag)
fout<<"NONE"<<endl;
return 0;
}