我如何打印 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&lt;string&gt;

改变

transformation.push_back(Q.front());

transformation.push_back(Q.front().word);

【讨论】:

以上是关于我如何打印 BFS 路径本身而不是这个单词阶梯的路径长度?的主要内容,如果未能解决你的问题,请参考以下文章

让 Find 只打印文件名,而不是完整路径

为啥它只打印文本文件的一个单词而不是整个文本文件到 html 文件

在 PHP 中查找重复的单词而不指定单词本身

如何使用广度优先搜索在树中找到从一个顶点到另一个顶点的路径?

POJ 3984 迷宫问题BFS/路径记录

11.迷宫问题(BFS 储存路径)