def __doSearch__(self,tree,char): ''' Backtracking, recherche recursive des solutions ''' if(self.totalLettres == 0): #Si toutes les lettres ont ete utilisee, que l'on est a la fin d'un #mot et que l'on a deja rencontre le caractere recherche on ajoute #la solution actuelle a la liste des solutions if (tree.finDeMot and char == '\0'): mot = "".join(self.currentWord) self.listeMot.append(mot) self.solution.append(self.listeMot[:]) self.listeMot.pop() return else : return elif(tree.finDeMot and char == '\0'): #Si l'on est a la fin d'un mot et que l'on a rencontre le caractere #recherche, on ajoute le mot a la solution actuelle. Et on cherche #a completer la solution. #En en profite pour verifier que l'on ne depasse pas le nombre max #de mots if(len(self.listeMot) + 1 < self.maxMot or self.maxMot == -1): saveWord = self.currentWord[:] self.listeMot.append(self.currentWord[:]) self.currentWord = [] self.__doSearch__(self.tree,self.__bestChar__()) self.listeMot.pop() self.currentWord = saveWord for child in tree.childrens: #Si l'on trouve le caractere recherche alors on continu en indiquant #que l'on a deja rencontre le caractere grace a la valeur '\0' if (child.value == char and self.occLettres[ord(char)-65] > 0): self.occLettres[ord(child.value) - 65] -= 1 self.totalLettres -= 1 self.currentWord.append(child.value) self.__doSearch__(child,'\0') self.occLettres[ord(child.value) - 65] += 1 self.totalLettres += 1 self.currentWord.pop() #Si l'on a deja rencontre le caractere recherche ou que le caractere #present sur le noeud suivant est plus rare que le caractere recherche #on continu le parcours en recherchant toujours le meme caractere elif ((char == '\0' or util.inferieur(child.value,char)) and self.occLettres[ord(child.value) - 65] > 0): self.occLettres[ord(child.value) -65] -= 1 self.totalLettres -= 1 self.currentWord.append(child.value) self.__doSearch__(child,char) self.occLettres[ord(child.value) -65] += 1 self.totalLettres += 1 self.currentWord.pop()
def __bestChar__(self): ''' Trouve le caractere qu'il faut chercher en premier ''' i = 0 while (self.occLettres[i] == 0): i += 1 if (i == 26): return '\0' minChar = chr(i+65) while(i < len(self.occLettres)): if (self.occLettres[i] > 0 and self.occLettres[i] <= self.occLettres[ord(minChar) - 65] and util.inferieur(chr(i+65),minChar)): minChar = chr(i+65) i += 1 return minChar