2014-05-02 10:07
原题:
Mapping '1' = 'A','B','C' '2' = 'D','E','F' ... '9' = input: 112 output :ouput = [AAD, BBD, CCD, AAE, AAF, BBE, BBF, CCE, CCF]
题目:电话的数字按键和字母有个映射关系,给定一串数字,请给出所有可能的字符映射方式。
解法:此人也不给个描述,搞的下面一堆人来猜题意。这个题目的意思是说,对于给定的数字串,有多少种不同的映射方式。像“112” -> “ABD”这样是不允许的,因为“1”只能表示一种字母,不能同时表示“A”和“B”。
代码:
1 // http://www.careercup.com/question?id=5765850736885760 2 #include <iostream> 3 #include <string> 4 #include <vector> 5 using namespace std; 6 7 void DFS(int idx, vector<pair<int, char> > &dict, vector<string> &result, const string &s) 8 { 9 int i; 10 11 if (idx == (int)dict.size()) { 12 static char m[10]; 13 14 for (i = 0; i < (int)dict.size(); ++i) { 15 m[dict[i].first] = dict[i].second; 16 } 17 18 static string res; 19 20 res.clear(); 21 for (i = 0; i < (int)s.length(); ++i) { 22 res.push_back(m[s[i] - '1']); 23 } 24 25 result.push_back(res); 26 return; 27 } 28 29 switch(dict[idx].first) { 30 case 0: 31 case 1: 32 case 2: 33 case 3: 34 case 4: 35 case 5: 36 case 6: 37 case 7: 38 for (i = 0; i < 3; ++i) { 39 dict[idx].second = (dict[idx].first * 3 + i) + 'A'; 40 DFS(idx + 1, dict, result, s); 41 } 42 break; 43 case 8: 44 for (i = 0; i < 2; ++i) { 45 dict[idx].second = (dict[idx].first * 3 + i) + 'A'; 46 DFS(idx + 1, dict, result, s); 47 } 48 break; 49 } 50 } 51 52 int main() 53 { 54 int i; 55 string s; 56 vector<pair<int, char> > dict; 57 vector<string> result; 58 int a[10]; 59 60 while (cin >> s) { 61 for (i = 0; i < 10; ++i) { 62 a[i] = 0; 63 } 64 for (i = 0; i < (int)s.length(); ++i) { 65 a[s[i] - '1'] = 1; 66 } 67 68 for (i = 0; i < 10; ++i) { 69 if (a[i]) { 70 dict.push_back(make_pair(i, '