题意:
《编程之美》上的题目:
电话号码盘一般可以用于输入字母,如用2可以输入A,B,C用3可以输入D,E,F等。
对于电话号码5869782,可以依次输出其代表的所有字母组合,如:JTMWTPA,JTMWTPB,...总共有3 * 3 * 3 *4 * 3* 4 * 3 = 3888种
#include <iostream>
#include <vector>
#include <stack>
#include <bitset>
using namespace std;
char dic[10][10] =
{
"", //0
"", //1
"ABC", //2
"DEF", //3
"GHI", //4
"JKL", //5
"MNO", //6
"PQRS", //7
"TUV", //8
"WXYZ" //9
};
int total[] = {0, 0, 3, 3, 3, 3, 3, 4, 3, 4};
int num = 1;
//number[]存放电话号码,number[i]表示第i个电话号码
//cur[i]表示number[i]对应的字符集中第i个字符
//index表示当前在第index号码上
void PhoneList(int number[],int cur[],int index, int n)
{
if (index == n)
{
printf("%d: ", num++);
for (int i = 0;i < n; ++i)
{
printf("%c", dic[number[i]][cur[i]]);
}
printf("\n");
return;
}
for (cur[index] = 0; index < n && cur[index] < total[number[index]]; cur[index]++)
{
PhoneList(number,cur,index + 1, n);
}
}
int main()
{
int number[] = {5,8,6, 9, 8, 7, 2};
int n = sizeof(number) / sizeof(number[0]);
int * cur = new int[n + 1];
num = 1;
PhoneList(number,cur,0, n);
if (cur)
{
delete[] cur;
cur = 0;
}
return 0;
}