关闭

编程之美读书笔记-电话号码对应英语单词

215人阅读 评论(0) 收藏 举报
分类:

题目:电话的号码盘一般可以用于输入字母,如用2可以输入a,b,c,用3可以输入d,e,f等。 对于号码5869872,可以依次输出其代表的所有字母组合。如:jtmwtpa,jtmwtpb……… 
您能否可以根据这样的对应关系设计一个程序,尽可能快地从这些字母组合中找到一个有意义的单词来描述一个电话号码呢?如:可以用单词computer来描述号码26678837。
解析:画出42所表示的排列树,如图所示。


采用循环的代码如下。

#include <iostream> 
using namespace std;
#define TellLength 11

//将每个数字所能代表的字符记录在一个二维数组中,其中假设0、1所代表的字符为空字符
char c[10][10] =
{
	"",        //0
	"",        //1
	"ABC",     //2
	"DEF",     //3
	"GHI",     //4
	"JKL",     //5
	"MNO",     //6
	"PQRS",    //7
	"TUV",     //8
	"WXYZ"     //9
};
//将每个数字所能代表的字母的总数记录在total数组中
int total[10] = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4 };
//将电话号码记录在number数组中
int number[TellLength];
//将数字目前所代表的字母在c数组中的列数下标记录在answer数组中,初始时为0
int answer[TellLength];

int main()
{
	number[0] = 1;
	number[1] = 8;
	number[2] = 7;
	number[3] = 0;
	number[4] = 1;
	number[5] = 1;
	number[6] = 2;
	number[7] = 7;
	number[8] = 7;
	number[9] = 2;
	number[10] = 0;
	while (true)
	{
		for (int i = 0; i < TellLength; i++) printf("%c", c[number[i]][answer[i]]);
		printf("\n");
		int k = TellLength - 1;
		while (k>=0)
		{
			if (answer[k] < total[number[k]] - 1)
			{
				answer[k]++;
				break;
			}
			else
			{
				answer[k] = 0;
				k--;
			}
		}
		if (k < 0) break;
	}
	return 0;
}
采用递归的代码如下。
#include <iostream> 
using namespace std;
#define TellLength 11

//将每个数字所能代表的字符记录在一个二维数组中,其中假设0、1所代表的字符为空字符
char c[10][10] =
{
	"",        //0
	"",        //1
	"ABC",     //2
	"DEF",     //3
	"GHI",     //4
	"JKL",     //5
	"MNO",     //6
	"PQRS",    //7
	"TUV",     //8
	"WXYZ"     //9
};
//将每个数字所能代表的字母的总数记录在total数组中
int total[10] = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4 };
//将电话号码记录在number数组中
int number[TellLength];
//将数字目前所代表的字母在c数组中的列数下标记录在answer数组中,初始时为0
int answer[TellLength];

void RecursiveSearch(int *number, int *answer, int index)
{
	if (index == TellLength-1)
	{
		for (int i = 0; i < TellLength; i++) printf("%c", c[number[i]][answer[i]]);
		printf("\n");
		return;
	}
	if(total[number[index]]==0) RecursiveSearch(number, answer, index + 1);
	for (answer[index] = 0; answer[index] < total[number[index]]; answer[index]++)
		RecursiveSearch(number, answer, index + 1);
}

int main()
{
	number[0] = 1;
	number[1] = 8;
	number[2] = 7;
	number[3] = 0;
	number[4] = 1;
	number[5] = 1;
	number[6] = 2;
	number[7] = 7;
	number[8] = 7;
	number[9] = 2;
	number[10] = 0;
	RecursiveSearch(number, answer, 0);
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:170100次
    • 积分:2427
    • 等级:
    • 排名:第15185名
    • 原创:85篇
    • 转载:110篇
    • 译文:18篇
    • 评论:29条
    博客专栏
    最新评论