C++ Trie中的最短路径

C++ Trie中的最短路径,c++,algorithm,data-structures,shortest-path,trie,C++,Algorithm,Data Structures,Shortest Path,Trie,对于数据结构项目,我必须在“猫”和“狗”这两个词之间找到最短路径,但我一次只能更改一个字母。我试图通过实现trie来实现这一点,但似乎无法实现最短路径搜索 猫->婴儿床->齿轮->狗 所有的单词都是相同长度的,我从字典文件中填充它们。 我们必须从一个词移动到另一个词,所以中间的词必须是有效的词 我认为使用trie是不可能的,但是任何人都知道吗?你想使用一个,算法被调用 可以在这里找到C实现,代码太长,无法作为答案发布: 解决这类问题的更好的数据结构是图形。 它被称为单词阶梯,您可以在这里查找:。

对于数据结构项目,我必须在“猫”和“狗”这两个词之间找到最短路径,但我一次只能更改一个字母。我试图通过实现trie来实现这一点,但似乎无法实现最短路径搜索

猫->婴儿床->齿轮->狗

所有的单词都是相同长度的,我从字典文件中填充它们。 我们必须从一个词移动到另一个词,所以中间的词必须是有效的词

我认为使用trie是不可能的,但是任何人都知道吗?

你想使用一个,算法被调用 可以在这里找到C实现,代码太长,无法作为答案发布:

解决这类问题的更好的数据结构是图形。
它被称为单词阶梯,您可以在这里查找:。

您正在寻找的是一个简单的BFS。每个单词都是一个图形顶点,但甚至不需要构建图形,您可以使用单词数组来解决它:

words = {"cat", "dog", "dot", "cot"}
mark = {0, 0, 0, 0}
distance = {0, 0, 0, 0}
queue Q
start_word_index = 0; // words[0] -> "cat"
destination_word_index = 1; // words[1] -> "dog"
Q.push(start_word_index)
while(Q is not empty) {
    word_index = Q.pop()
    for each `words[j]` {
        if (difference between `words[word_index]` and `words[j]` is only 1 character) AND
           (`mark[j]` is not 1) {
            mark[j] = 1
            Q.push(j)
            distance[j] = distance[word_index] + 1
        }
    }
}

if mark[destination_word_index] is 0 {
    print "Not reachable"
} else {
    print "Distance is ", distance[destination_word_index]
}

请注意,通常从字典中构造的trie中的最短过去并不是一个很好的相似性度量!例如,“pear”和“bear”非常相似,但需要在标准trie中上上下下。