0

My program has a function named 'WordLadder' that uses BFS to make a path from one word in a dictionary to another. I was given a starter code that prints the number of nodes in the path, but I want to print the path itself. Currently, I have appended the words to a vector as they enter a queue but I am not able to return the vector as part of my 'WordLadder' function in order to print it in the main program.

I just want the program to print a path based on the two words I picked, i.e. "TOON - POON - POIN - POIE - PLIE - PLEE - PLEA", if the start word is "TOON" in the dictionary and the target word is "PLEA" in the dictionary.

I tried to declare the vector outside of the function and print it in main with this code, but I was unsuccessful.


void print(std::vector < int >
  const & transformation) {
  std::cout << "The vector elements are : ";

  for (int i = 0; i < transformation.size(); i++)
    std::cout << transformation.at(i) << ' ';
}

I have attempted to return the vector inside of the function, but I receive this error

 error: no viable conversion
      from returned value of type
      'vector<std::__cxx11::string>' (aka
      'vector<basic_string<char> >') to
      function return type 'int'
          return transformation;

Here is my code. Any help would be appreciated, as I am new to C++.


// To check if strings differ by exactly one character 
bool nextWord(string & a, string & b) {
  int count = 0; // counts how many differences 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 > & ew) {
  //Create vector to store path in a
  vector < string > transformation;

  // Create a queue for BFS and insert 'start' as source vertex 
  queue < QItem > Q;
  QItem item = {
    start
  };
  Q.push(item);

  // While queue is not empty 
  while (!Q.empty()) {

    // Take the front word 
    QItem curr = Q.front();
    transformation.push_back(Q.front().word);
    Q.pop();

    // Go through all words of dictionary 
    for (set < string > ::iterator it = ew.begin(); it != ew.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
        ew.erase(temp);

        // If we reached target 
        if (temp == target) {
          return trasformation;
        }

      }
    }
  }

  return 0;
}

// Driver program 
int main() {
  string start;
  string target;

  // make dictionary 
  std::ifstream file("english-words.txt");
  set < string > ew;

  copy(istream_iterator < string > (file),
    istream_iterator < string > (),
    inserter(ew, ew.end()));

  cout << endl;
  cout << "Enter Start Word" << endl;
  cin >> start;
  cout << "Enter Target Word" << endl;
  cin >> target;

  cout << wordLadder(start, target, ew);

  return 0;
}
  • possible duplicate of https://stackoverflow.com/questions/10750057/how-to-print-out-the-contents-of-a-vector – rezaebrh Dec 18 '19 at 07:51
  • 1
    The function `wordLadder` has return type `int` but one path returns `transformation`. `transformation` is a `std::vector`. The error message is pretty clear. – Thomas Sablik Dec 18 '19 at 07:53
  • 1
    Not a bug, but in `return count == 1 ? true : false;` the condition already is a boolean, so `return count == 1;` will do just fine. – molbdnilo Dec 18 '19 at 08:06

1 Answers1

1

There are multiple problems.

You were on the right track when you said "I tried to declare the vector outside of the function and print it in main..."

So, change wordLadder to take the vector by reference.

int wordLadder(vector<string> &transformation, string & start, string & target, set < string > & ew)

Then declare it in main and pass it to wordLadder

vector<string> t;
wordLadder(t, start, target, ew);
print(t);

You will have to also change print to take a vector of the right type, ie. string and not int

void print(std::vector < string > &transformation)
acraig5075
  • 10,588
  • 3
  • 31
  • 50