Escaleras de palabras II

Esta pregunta me ha molestado durante muchos días. El algoritmo central es en realidad el pseudocódigo que se proporciona en el libro, ¡que debe leerse con atención! Pero todavía hay muchas partes que necesitan ser mejoradas.
Pseudocódigo de la idea central

Primero pega el código

#include "string"
#include "lexicon.h"
#include "queue.h"
#include "simpio.h"
#include "vector.h"
#include "console.h"
#include "map.h"
#include <iostream>

using namespace std;

Vector<string> Findladders(const string &start,const string &end,const Lexicon wordlist)
{
Queue<Vector<string>> paths;
Vector<string> first;
Set<string> usedword;
Vector<string> shortest;//表示当前处理路径
first.add(start);
paths.add(first);
usedword.add(start);

while(!paths.isEmpty())
{
    shortest =paths.dequeue();
    string lastword = shortest.back();
    if(lastword == end)
    {cout<<"Found ladder:";
    return shortest;}
    else
    {

        for(int a=0; a<lastword.length(); a++)
        {
            for(char b ='a'; b<='z';b++)
            {   string copy = lastword;
                copy[a] = b;
                if (wordlist.contains(copy) && !usedword.contains(copy))
                {
                    usedword.add(copy);
                    Vector<string> laddercopy = shortest;
                    laddercopy.add(copy);
                    paths.add(laddercopy);
                }
            }
        }

    }

}
cout<<"No ladder found";
Vector<string> a;
return a;
}
int main() {

// [TODO: fill in the code]
Lexicon wordlist("EnglishWords.txt");
while(true)
{
   string start = ""; string end = "";
   Vector<string>ladders;
   cout<<"Enter start word(RETURN to quit): ";
   cin>>start;
   cout<<"Enter distination word: ";
   cin>>end;
   ladders = Findladders(start,end,wordlist);
   cout<<ladders<<endl;
}
return 0;
}

Ejecución de resultados:
resultado de la operación
se requiere generar el resultado más corto. Usando DFS, todas las rutas posibles (en realidad, de corta a larga) de cambios de palabra (solo una letra es diferente de la palabra anterior) se almacenan en una Cola<Vector>. Cuando hay un punto final de ruta que es la palabra objetivo, hemos encontrado la ruta más corta. De acuerdo con el principio first-in-first-out de Queue, seleccionamos una ruta desde el principio cada vez para juzgar si es la ruta de destino y, si no, la eliminamos.

Hay varios problemas:
1) La palabra inicial que ingresamos es una cadena, ¿cómo convertirla en una ruta que contenga solo esta palabra?
De hecho, nuestra función de implementación es: VectorFindladder(const string & start, const string &end, const Lexicon & wordlist> [¡Preste atención a la forma de transferencia de parámetros!] La función define las variables de Cola y Vector al principio, y agrega una cadena a Vector y Vector a Cola para resolver el problema
.

2) Debido a que todas las referencias a palabras son constantes, cuando se necesita modificar una palabra, se debe hacer una copia

El cuerpo principal es una función while.Cuando la palabra final no es la palabra objetivo, debemos hacer una copia de la ruta actual, agregar la palabra recién modificada a la ruta copiada y luego agregar la ruta copiada con una palabra al conjunto de rutas Vector. Debido a que es necesario eliminar la ruta original, la diferencia entre la ruta recién generada y la ruta original es solo una palabra, por lo que 1. Necesitamos copiar 2. La longitud de la ruta en este conjunto de rutas aumenta: primero genere todas las rutas con una longitud de 2, y luego genere todas las rutas con una longitud de 3... Se puede ver que la primera ruta de destino que obtuvimos es la más corta.
También tenga en cuenta que se usa Vectorusedword para guardar las palabras usadas para evitar un bucle infinito.

Hay algunas dudas: el título solicita usar Vector para almacenar cada ruta, pero cada palabra tendrá comillas al generar (el ejemplo no tiene comillas), ¿cómo lidiar con eso?
¿Cómo no generar un Vector vacío cuando no se encuentra ninguna escalera?

Supongo que te gusta

Origin blog.csdn.net/weixin_43846562/article/details/90436851
Recomendado
Clasificación