Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
    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