具体问题描述见:《编程之美》-3.2 电话号码对应英语单词,在本文中主要根据《编程之美》中的思想分别利用递归与非递归的思想实现了电话号码对应英语单词的构造实现,主要考虑了排列树的思想,利用遍历树中的每个叶子节点来实现所有单词的集合。对应文中的查找方法正如《编程之美》中介绍的方法一样,主要根据构造的字典去匹配查找,其中具体思路请参考《编程之美》。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char c[10][10]={" "," ","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"}; //将各个数字所能代表的字符存储在一个二维数组中,并且假设0,1所代表的字符为空字符
int total[10]={0,0,3,3,3,3,3,4,3,4}; //各个数字所代表的字符总数构成的数组
void RSearch(int *num,int *answer,int index,int n)
{
int i;
if (index==n)
{
for (i=0;i<n;i++)
printf("%c",c[num[i]][answer[i]]);
printf("\n");
return;
}
/*遍历数中的每一个结点,所得到的所有路径是根据电话号码构造的单词*/
for (answer[index]=0;answer[index]<total[num[index]];answer[index]++)
{
RSearch(num,answer,index+1,n);
}
}
void RrSearch(int *num,int *answer,int n)
{
int i,k;
while (1)
{
for (i=0;i<n;i++)
printf("%c",c[num[i]][answer[i]]);
printf("\n");
k=n-1;
while (k>=0)
{
if (answer[k]<total[num[k]]-1)
{
answer[k]++;//第k个数的英语字母改变
break; //只要有一个字母改变,就退出打印对应的英语字母
}
else
{
answer[k]=0; //第k个数移动完毕,并将其定义为0,接着开始遍历下一个数字
k--;
}
}
if (k<0)
break;
}
}
void main()
{
int answer[10]={0};
int answer1[10]={0};
int num[]={2,3,9};
int n=sizeof(num)/sizeof(num[0]);
printf("递归算法求得的结果:\n");
RSearch(num,answer,0,n);
printf("非递归算法求得的结果:\n");
RrSearch(num,answer1,n);
system("pause");
}