我如何打印 BFS 路径本身而不是这个单词阶梯的路径长度?
Posted
技术标签:
【中文标题】我如何打印 BFS 路径本身而不是这个单词阶梯的路径长度?【英文标题】:How can I print the BFS path itself rather than the length of the path from this word ladder? 【发布时间】:2019-12-18 05:33:49 【问题描述】:我收到了用于实现广度优先搜索的字梯的起始代码/算法。该程序需要一个单词字典,但我修改它以获取一个输入文件。给我的算法打印从源词到目标词的路径长度 ex:如果需要 4 次转换才能到达目标词,它将打印 4。我想打印路径本身。例如:如果源词是“TOON”,源词是“PLEA”,它应该打印“TOON -> POON -> POIN -> PLIN -> PLIA -> PLEA”
到目前为止,我尝试添加一个循环,将队列中的单词附加到向量,然后返回向量,但我收到了一个我不明白的错误。
main.cpp:42:18: error: no matching member function for
call to 'push_back'
transformation.push_back(Q.front());
这几天我被这件事难住了,所以任何帮助都将不胜感激。我是 C++ 新手,如有任何错误请见谅。
这里是代码
#include<bits/stdc++.h>
#include <iostream>
using namespace std;
// To check if strings differ by exactly one character
bool nextWord(string & a, string & b)
int count = 0; // counts how many differeces there
int n = a.length();
// Iterator that loops through all characters and returns false if there is more than one different letter
for (int i = 0; i < n; i++)
if (a[i] != b[i])
count++;
if (count > 1)
return false;
return count == 1 ? true : false;
// A queue item to store the words
struct QItem
string word;
;
// Returns length of shortest chain to reach 'target' from 'start'
// using minimum number of adjacent moves. D is dictionary
int wordLadder(string & start, string & target, set < string > & D)
vector < string > transformation;
// Create a queue for BFS and insert 'start' as source vertex
queue < QItem > Q;
QItem item =
start
; // Chain length for start word is 1
Q.push(item);
transformation.push_back(Q.front());
// While queue is not empty
while (!Q.empty())
// Take the front word
QItem curr = Q.front();
Q.pop();
// Go through all words of dictionary
for (set < string > ::iterator it = D.begin(); it != D.end(); it++)
// Proccess the next word according to BFS
string temp = * it;
if (nextWord(curr.word, temp))
// Add this word to queue from the dictionary
item.word = temp;
Q.push(item);
// Pop from dictionary so that this word is not repeated
D.erase(temp);
// If we reached target
if (temp == target)
return 0;
return 0;
string start;
string target;
// Driver program
int main()
// make dictionary
std::ifstream file("english-words.txt");
set < string > D;
copy(istream_iterator < string > (file),
istream_iterator < string > (),
inserter(D, D.end()));
cout << endl;
cout << "Enter Start Word" << endl;
cin >> start;
cout << "Enter Target Word" << endl;
cin >> target;
cout << wordLadder(start, target, D);
return 0;
【问题讨论】:
我也尝试过从函数返回队列,它只会返回一个单词,但即使作为一个没有成功的测试。 你应该看看Why should I not #include <bits/stdc++.h>?,因为你可能不知道它的作用。尤其是与using namespace std;
(即bad practice)结合使用时,它几乎肯定会在大型项目中引起一些奇怪的错误。
这是入门代码的一部分,我会更改它。
【参考方案1】:
您试图将错误的对象附加到 vector<string>
改变
transformation.push_back(Q.front());
到
transformation.push_back(Q.front().word);
【讨论】:
以上是关于我如何打印 BFS 路径本身而不是这个单词阶梯的路径长度?的主要内容,如果未能解决你的问题,请参考以下文章
为啥它只打印文本文件的一个单词而不是整个文本文件到 html 文件