电话号码对应的英语单词

具体问题描述见:《编程之美》-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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值