原始問題如下:手機上面的數字鍵均對應了幾個字元,譬如2對應了a,b,c。問題是當輸入一段數字後,求出所有可能的字元組合,(可以想象一下發簡訊時候的狀況,每當按幾個數字鍵後,均給出可能的漢語拼音,當然這個要求就更高了,本題只要求給出所有可能的組合)。
舉個例子輸入4,2鍵後,則給出GA,GB,GC,HA,HB,HC,IA,IB,IC組合。
當然對於大多數人來說就是幾層迴圈就搞定了,每層遍曆,內部輸出。但是我們當然是追求更高的演算法了。若按普通做法,那麼每多按一個數字就會導致再添加一個for迴圈了,明顯不合適。下面給出讓你佩服的方法:
#include<iostream>using namespace std;const int MaxLength = 9;char c[10][10] = {"", "", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"};int total[10] = {0,0,3,3,3,3,3,4,3,4};int main(){int number[MaxLength] = {2,3,4}; //本例輸入數字2,3,4int answer[MaxLength] = {0};int len = 3;while(true){for(int i = 0; i < len; i++)printf("%c", c[number[i]][answer[i]]);printf("\n");int k = len - 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;}
居然只有兩層迴圈就搞定了,讀了半天都沒讀懂,不過讀懂過後令人非常欽佩啊,原來還可以這麼寫!程式可讀性不強,不過也說明咱讀代碼水平不高,話說牛叉的演算法不都是精簡而高效,可讀性不強麼。
感歎之餘,觀察此演算法也是非常適合排列組合的產生麼。厲害啊。