def inversaDFS(self):
        
        """
        Exceção em:
        1 2 3
        4 5 0
        0 1 1
        """
        
        from inversãoDeMatrizes import MatrizEstendidaEstado        
        """
        Usaremos uma busca em profundidade.
        Vamos precisar de um estado inicial para fazer a busca e uma fila fronteira
        """
        estadoInicial = MatrizEstendidaEstado.estadoInicial(self)
        fronteira = [estadoInicial]
        quantidadeDeExpandidos = 0
        quantidadeDeVisitados = 0
        expansoesDeVisitados = 0
        conjuntoDeVisitados = set()
        
        """
        Agora, para cada estado no final da fila, verificamos se é o estado final.
        Se não for, adicionamos os sucessores dele que já não estão
        na fila ao fim dela.
        """
        while (len(fronteira) != 0):
            atual = fronteira.pop()
            conjuntoDeVisitados.add(atual)
            quantidadeDeVisitados += 1
            
            if (atual.testeEstadoFinal()):
                
                inversa = [linha[len(linha)//2:] for linha in atual.linhasDaMatriz]
                print("%s estados expandidos. %s visitados. %s expansões de visitados." \
                                        % (quantidadeDeExpandidos, quantidadeDeVisitados, expansoesDeVisitados))
                return Matriz(inversa)
            else:
                sucessoresDoAtual = atual.sucessores()
                quantidadeDeExpandidos += len(sucessoresDoAtual)
#                 for sucessor in [sucessor for sucessor in sucessoresDoAtual if sucessor not in fronteira \
#                                  and sucessor not in conjuntoDeVisitados]:
#                     fronteira.append(sucessor)
                    
                for sucessor in sucessoresDoAtual:
                    if (sucessor in conjuntoDeVisitados):
                        expansoesDeVisitados += 1
                    if (sucessor not in fronteira and sucessor not in conjuntoDeVisitados):
                        fronteira.append(sucessor)
    def inversaComHeuristica(self):
        
        from inversãoDeMatrizes import MatrizEstendidaEstado
        import heapq
        
        """
        Vamos precisar de um estado inicial para fazer a busca e um heap fronteira
        """
        estadoInicial = MatrizEstendidaEstado.estadoInicial(self)
        fronteira = [(estadoInicial.heuristica(), estadoInicial)]
        conjuntoDeVisitados = set()
        heapq.heapify(fronteira)
        quantidadeDeExpandidos = 0
        quantidadeDeVisitados = 0
        expansoesDeVisitados = 0
        
        """
        Agora, escolhemos o estado com a menor heurística e, verificamos se é o estado final.
        Se não for, adicionamos os sucessores dele que já não estão
        na fila ao fim dela.
        """
        while (True):
#             (heuristica, estadoAtual) = fronteira[0]            
            
            (heuristicaDoEstadoAtual, estadoAtual) = heapq.heappop(fronteira)
            quantidadeDeVisitados += 1
            
            if (estadoAtual.testeEstadoFinal()):
                print("%s estados expandidos. %s visitados. %s expansões de visitados." \
                                        % (quantidadeDeExpandidos, quantidadeDeVisitados, expansoesDeVisitados))
                inversa = Matriz([linha[len(linha)//2::] for linha in estadoAtual.linhasDaMatriz])
                return inversa
            else:
                
                sucessoresDoAtual = estadoAtual.sucessores()
                quantidadeDeExpandidos += len(sucessoresDoAtual)
                                 
                for sucessor in sucessoresDoAtual:
                    tuplaSucessor = (sucessor.heuristica(), sucessor)
                    
                    if (tuplaSucessor in conjuntoDeVisitados):
                        expansoesDeVisitados+=1
                    
                    if (tuplaSucessor not in fronteira and tuplaSucessor not in conjuntoDeVisitados):
                        heapq.heappush(fronteira, tuplaSucessor)
                    
                    
            
            conjuntoDeVisitados.add((heuristicaDoEstadoAtual, estadoAtual))