2009-11-13 3 views
2

Étant donné un numéro de téléphone à 10 chiffres, nous devons imprimer toutes les chaînes créées à partir de ce numéro. Le mappage des numéros est celui qui est exactement sur le clavier d'un téléphone.Imprimer les chaînes possibles créées à partir d'un nombre

-à-dire pour 1,0-> aucune lettre pour 2-> A, B, C

Ainsi, par exemple, 1230 ADG BDG CDG AEG ....

Quelle est la meilleure solution en c/C++ à ce problème?

+0

est ce devoir? –

+1

Que voulez-vous dire par "style de programmation" dans ce contexte? – Suppressingfire

+0

devoirs? Si c'est le cas, s'il vous plaît –

Répondre

2

Je pense qu'une solution récursive serait bonne pour celui-ci. Donc quelque chose comme:

def PossibleWords(numberInput, cumulative, results): 
    if len(numberInput) == 0: 
     results.append(cumulative) 
    else: 
     num = numberInput[0] 
     rest = numberInput[1:] 
     possibilities = mapping[num] 
     if len(possibilities) == 0: 
      PossibleWords(rest, cumulative, results) 
     else: 
      for p in possibilities: 
       PossibleWords(rest, cumulative + p, results) 

result = [] 
PossibleWords('1243543', '', result) 
+1

Vouliez-vous dire passer les résultats comme le 3ème paramètre de l'appel récursif à PossibleWords()? – Suppressingfire

+0

Pouvez-vous donner un exemple en c ou C++? – Ari

+1

Vous avez seulement demandé une bonne solution à ce problème. Pourquoi auriez-vous besoin d'un exemple spécifique en c ou C++ si ce n'est pas une question de devoirs? Python est aussi proche que possible du pseudocode. Je recommande de travailler par vous-même. – Smashery

1

Pas besoin d'aller récursif. Voici un exemple d'approche itérative pour commencer. Il imprime toutes les possibilités, mais vous ne pouvez pas entièrement aimer son comportement. Le hic reste pour le lecteur à découvrir ;-)

string tab[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; 
string s="1201075384"; //input string 

for(int mask=0;mask<1048576;mask++)//4^10, trying all the posibilities 
{ 
    int m=mask; 
    string cur=""; 
    for(int i=0;i<s.size();i++,m/=4) 
    if (m%4<tab[s[i]-'0'].size()) 
     cur+=tab[s[i]-'0'][m%4]; 
    cout<<cur<<endl; 
} 
+0

Pourquoi ce vote a-t-il été voté? – supo

+0

Ce n'était pas le cas. (15 caractères) – aehlke

1

Une version C++ de la solution python Smashery:

string getMapping(int num){ 
    assert(num>=2 && num<=9); 

    switch(num){ 
     case 2: 
      return "ABC"; 
     case 3: 
      return "DEF"; 
     case 4: 
      return "GHI"; 
     case 5: 
      return "JKL"; 
     case 6: 
      return "MNO"; 
     case 7: 
      return "PRS"; 
     case 8: 
      return "TUV"; 
     case 9: 
      return "WXY"; 
     default: 
      return " "; 
    } 
} 


// Recursive function 
void generateWords(string input, string cumulative, vector<string> &result){ 

    if(input.length() == 0){ 
     result.push_back(cumulative); 
    } 
    else{ 
     int num = input.at(0) - '0'; 
     string rest = input.substr(1, input.length()-1); 
     string mapString = getMapping(num); 
     if(mapString.compare(" ") != 0){ 
      for(int i=0; i<mapString.length(); i++){ 
       generateWords(rest, cumulative+mapString.at(i), result); 
      } 
     } 
     else{ 
      assert(1==0); 
     } 
    } 
} 


void process(){ 

    generateWords("4734", "", words); 

} 
Questions connexes