基本思路:这道题从正向做不太好想,我是逆着思考的。他不是让把输入数字串变成符合要求的字符串吗?我就先把dict.txt文件中的所有的字符串先转化成数字串存放在一个数组中,这样一来,判断输入的数字串是否符合要求就简单多了,遍历一遍该数组就可以了。对比起来正向做,省去了根据数字组合字符的过程。并且存放已转化的数字串和dict.txt中的字符串是一一映射的,所以如果符合要求,再去dict.txt中找对应的字符串输出即可。注意有的数字串不止对应一个字符串,所以输出结果需用数组存放。
/*
ID: boyshan1PROG: namenum
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
string str[4617],str2[4617];
void change_name_to_num() //第一步,把dict.txt中的字符串转换成数字串并存放在数组str2中
{
string name,num;
int i=0,j,k=0;
ifstream fin("dict.txt");
while(fin>>str[i++])
{
name=str[i-1]; //从names文件中提取一个字符串
for(j=0;j<name.length();j++)//逐个扫描字符串中的字符
{
switch(name[j]) //将字符逐个转换成数字,并合成数字串
{
case 'A':
case 'B':
case 'C':num+='2';break;
case 'D':
case 'E':
case 'F':num+='3';break;
case 'G':
case 'H':
case 'I':num+='4';break;
case 'J':
case 'K':
case 'L':num+='5';break;
case 'M':
case 'N':
case 'O':num+='6';break;
case 'P':
case 'R':
case 'S':num+='7';break;
case 'T':
case 'U':
case 'V':num+='8';break;
case 'W':
case 'X':
case 'Y':num+='9';break;
}
}
str2[k++]=num;
num=""; //合成一个数字串后,清空数字串num,为下一个数字串的合成做准备
}
}
int main()
{
string num,name,num2;
int i=0,j,flag[1000];
bool has;
ifstream din("namenum.in"); //用来读取输入的字符串
ofstream gout("namenum.out");//用来写出输出的结果
change_name_to_num();
while(din>>num) //第二步,根据输入的数字串,对文件中的数字串进行遍历并输出结果
{
has=false;
for(j=0;j<4617;j++)
{
if(num==str2[j])
{
has=true;
flag[i++]=j;//flag数组用来记录符合要求的字符串的下标
}
}
if(has)
{
for(j=0;j<i;j++)
{
name=str[flag[j]]; //在dict中找到字符串
gout<<name<<endl;
}
}
else gout<<"NONE"<<endl;
j=0;i=0; //清零
}
return 0;
}