《编程之美》第3.2节:电话号码对应英语单词
题目:给定一个电话号码,输出可能的所有英语单词
解法:穷举所有可能的情况,并输出
代码:
#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
void printResult1(map<int,string>&telephone,string &num,string result,int index)
{
if(index==num.size())
{
cout<<result<<endl;
return ;
}
for(int i=0;i<telephone[num[index]-'0'].size();i++)
{
result+=telephone[num[index]-'0'][i];
printResult1(telephone,num,result,++index);
--index;
result.pop_back();
}index++;
}
void printResult2(map<int,string>&telephone,string&num,int *anwser)
{
while(true)
{
for(int i=0;i<num.size();i++)
cout<<telephone[num[i]-'0'][anwser[i]];
cout<<endl;
int k=num.size()-1;
while(k>=0)
{
if(anwser[k]<telephone[num[k]-'0'].size()-1)
{
anwser[k]++;
break;
}
else
{
anwser[k]=0;
k--;//表示当前位已经遍历一遍,现在开始遍历下一位
}
}
if(k<0)
break;
}
}
void printResult3(map<int,string>&telephone,string&num,int *anwser)
{
int k=num.size()-1;
while(true)
{
if(anwser[k]<telephone[num[k]-'0'].size()-1)
{
anwser[k]++;
k=num.size()-1;
for(int i=0;i<num.size();i++)
cout<<telephone[num[i]-'0'][anwser[i]];
cout<<endl;
}
else
{
anwser[k]=0;
k--;
if(k<0)
break;
}
}
}
int main()
{
map<int,string> telephone;
telephone[0]=" ";
telephone[1]=" ";
telephone[2]="ABC";
telephone[3]="DEF";
telephone[4]="GHI";
telephone[5]="JKL";
telephone[6]="MNO";
telephone[7]="PQRS";
telephone[8]="TUV";
telephone[9]="WXYZ";
string num="26678837";
int *anwser=new int[num.size()];
memset(anwser,0,sizeof(int)*num.size());
printResult1(telephone,num,string(),0);
printResult2(telephone,num,anwser);
printResult3(telephone,num,anwser);
system("pause");
return 0;
}