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

原创 2016年08月31日 13:06:41

题目:电话的号码盘一般可以用于输入字母,如用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;
}


《linux高性能服务器编程》读书笔记

linux高性能服务器编程 从高到底的协议有: 应用层:ping(使用ICMP)、telnet(使用tcp)、OSPF(使用IP)、DNS(使用UDP) 传输层:TCP、UDP 网络层:ICMP、...

随机算法-模拟退火

模拟退火算法:爬山算法的改进

编程之美: 第三章 结构之法 3.2电话号码对应英语单词

/* 电话号码对应英语单词: 电话的号码盘一般可以用于输入字母。如用2可以输入A,B,C,用3可以输入D,E,F等。 对于号码5869872,可以依次输出其代表的所有字母组合。例如:JTMWTPA,J...

编程之美之电话号码对应英语单词

题目一:根据电话上字母和数字的对应关系,用一个有意义的单词来表述一个电话号码,如用computer表示26678837 题目二:反过来,给定一个电话号码,是否可以用一个单词来表示呢?怎样表示最快呢?...

编程之美 3.2 电话号码对应英语单词

题目描述 电话的号码盘一般可以用于输入字母。如用2可以输入A、B、C,用3可以输入D、E、F等。 对于号码5869872,可以依次输出其代表的所有字母组合。如:JTMWTPA、JTMWTB····...

[编程之美] PSet3.2 电话号码对应英语单词

 问题描述:        对如非全键盘的手机上的数字,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,要求对一段数字,输出其代表的所有...

编程之美-3.2-电话号码对应英语单词

1. 简述     电话的号码盘一般可以用于输入字母。如用2可以输入A、B、C,用3可以输入D、E、F等。     对于号码5869872,可以依次输出其代表的所有字母组合。如:JTMWTPA、J...

编程之美3.2 电话号码对应英语单词

java实现: import java.util.ArrayList; import java.util.List; public class Telphone { /** * 保存每个数...

3.2 电话号码对应的英语单词

1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析一个数字, 对应一个字符数组, 这个问题其实就是穷举出这个数字数组能够表示的所有的字符的拼凑, 然后找出为单词的序列 这里...

电话号码对应的英语单词

具体问题描述见:《编程之美》-3.2 电话号码对应英语单词,在本文中主要根据《编程之美》中的思想分别利用递归与非递归的思想实现了电话号码对应英语单词的构造实现,主要考虑了排列树的思想,利用遍历树中的每...
  • yyme411
  • yyme411
  • 2013年10月03日 16:31
  • 761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编程之美读书笔记-电话号码对应英语单词
举报原因:
原因补充:

(最多只允许输入30个字)