随笔-80  评论-24  文章-0  trackbacks-0
手机上的T9键盘每个数字按键对应若干个字母,要求输入一个电话号码,输出所有的可能的字母组合。
比如:

1   char *hash[10] = {"", "", "ABC", "DEF", "GHI", 
2     "JKL", "MNO", "PQRS", "TUV", "WXYZ"};

可以知道数字2对应着A,B,C三个字母,数字3对应着D,E,F三个字母,以此类推。那么对于电话号码345,可能的字母组合有27种,如果要我们手写的话可能会这么写,先写ADG,再写BDG,再写CDE,然后在写AEG,然后是BEG,然后是CEG等等。同样,写程序也可以按照这个思路来,只不过对每个数字,我们都需要记录当前打印到那个字母了。根据手写过程可以很容易的理解下面的程序:

 1 void find_all_words(int *call_num, int n) {
 2   int i;
 3   if (call_num == NULL || n <= 0) {
 4     return;
 5   }
 6 
 7   char *hash[10] = {"", "", "ABC", "DEF", "GHI", 
 8     "JKL", "MNO", "PQRS", "TUV", "WXYZ"};
 9 
10   int cur_index[n];
11   memset(cur_index, 0, sizeof(cur_index) * n); 
12 
13   int total_amount[10];
14   for (i = 0; i < 10; ++i) {
15     total_amount[i] = strlen(hash[i]);
16   }
17 
18   while (1) {
19     for (i = 0; i < n; ++i) {
20       printf("%c", hash[call_num[i]][cur_index[i]]);
21     }   
22     printf("\n");
23 
24     int index = 0;
25     while (index < n) {
26       if (cur_index[index] >= total_amount[call_num[index]] - 1) {
27         cur_index[index] = 0;
28         index++;
29       } else {
30         cur_index[index]++;
31         break;
32       }   
33     }   
34     if (index == n) {
35       break;
36     }   
37   }
38 }

如果是递归算法的话也比较简单,如下 :

 1 char *hash[10] = {"", "", "ABC", "DEF", "GHI", 
 2   "JKL", "MNO", "PQRS", "TUV", "WXYZ"};
 3 
 4 #define MAX_LEN 100
 5 int cur_index[MAX_LEN];
 6 int total_amount[10];
 7 
 8 void find_all_words(int *call_num, int n, int index) {
 9   int i;
10   if (index == n) {
11     for (i = 0; i < n; ++i) {
12       printf("%c", hash[call_num[i]][cur_index[i]]);
13     }   
14     printf("\n");
15   } else {
16     for (cur_index[index] = 0;
17         cur_index[index] < total_amount[call_num[index]]; 
18         ++cur_index[index]) {
19       find_all_words(call_num, n, index + 1); 
20     }   
21   }
22 }

别忘了初始化cur_index和totla_amount数组。
posted on 2012-09-03 22:25 myjfm 阅读(394) 评论(0)  编辑 收藏 引用 所属分类: 算法基础

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理