题目:
对如非全键盘的手机上的数字,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,要求对一段数字,输出其代表的所有可能的字母组合,如5869,可能代表JTMW、JTMX.................
方法一如果换成for循环则需要n个for,这里用有限的while和for模拟了n个for的情形。
方法二可以想象成function(){
for(){
function(){
for(){
.............n个function与for的反复包含情形,也就是N个for()的简写,只不过被称为了递归
}
}
}
}
#include "stdafx.h"
#include<iostream>
#include<cstring>
using namespace std;
//键盘数字上的字符
char c[10][10] = {
"", "", "ABC", "DEF",
"GHI", "JKL", "MNO",
"PQRS", "TUV", "WXYZ"};
//0到每个数组键上字符的个数
int total[] = {0, 0, 3, 3, 3, 3, 3, 4, 3, 4};
const int TelLength = 3; //电话号码的位数,要加const,因为数组定义要固定的长度
int number[TelLength];//每位电话号码的数字
int answer[TelLength]; //每位数字上字符的下标
//方法一
void OutputTelephone(int number[])
{
while (true)
{
int k = TelLength - 1;
//一次循环一次从第k个键向前移动一位
for (int i = 0; i < TelLength; i++)
cout << c[number[i]][answer[i]] << " ";
cout << endl;
while (k >= 0)
{
if (answer[k] < total[number[k]] - 1)
{
//第k个键移动
answer[k]++;
break; //这里只要有一个键的一个位置发生一次变化,就退出,打印一次。
}
else
{
//第k个键移动完毕,回到,开始遍历上一个键。
//此时,继续内部循环。下次循环,处理上一个键。
answer[k] = 0;
k--;
}
}
if (k < 0)
break;
}
}
//方法2
void RecursiveOutput(int number[], int answer[], int index)
{
if (index == TelLength)
{
for (int i = 0; i < TelLength; i++)
cout << c[number[i]][answer[i]] << " ";
cout << endl;
return;
}
//上下来回反弹的都以递归啊,类似于dfs
for (answer[index] = 0; answer[index] < total[number[index]]; answer[index]++)
{
RecursiveOutput(number, answer, index + 1);
}
}
int main()
{cout <<number[1] << " ";
int number[] = {3, 4, 5};
cout <<answer[1] << " ";
OutputTelephone(number);
RecursiveOutput(number, answer, 0);
return 0;
}