diff --git a/src/Boggle.cpp b/src/Boggle.cpp index 54332ff..25aa5e8 100755 --- a/src/Boggle.cpp +++ b/src/Boggle.cpp @@ -12,6 +12,7 @@ #include "strlib.h" #include #include +#include // The res folder isn't copied the same way on macOS #ifdef __APPLE__ @@ -61,3 +62,42 @@ unsigned int Boggle::getPointsForWord(const std::string &word) { const int pointsForValidWord = word.length() - s_MIN_WORD_LENGTH; return std::min(pointsForValidWord, 0); } + +std::vector Boggle::computerPlay() const { + std::unordered_set visited; + std::vector valiWords; + + for (const std::string &cube : m_showingSides) { + visited.insert(cube); + std::string word; + for (const char c : word) { + word.push_back(c); + backtrack(valiWords, visited, word); + } + } + + return valiWords; +} + +void Boggle::backtrack(std::vector &validWords, + std::unordered_set &visited, + std::string &word) const { + if (!m_englishWords.containsPrefix(word)) + return; + + if (word.size() >= s_MIN_WORD_LENGTH && m_englishWords.contains(word)) + validWords.push_back(word); + + for (const std::string &neighbor : m_showingSides) { + bool neighborAlreadyVisited = visited.find(neighbor) != visited.end(); + if (neighborAlreadyVisited) + continue; + + visited.insert(word); + for (const char neighborChar : neighbor) { + word.push_back(neighborChar); + backtrack(validWords, visited, word); + word.pop_back(); + } + } +} diff --git a/src/Boggle.h b/src/Boggle.h index 07550dd..8f0e3c3 100755 --- a/src/Boggle.h +++ b/src/Boggle.h @@ -12,6 +12,7 @@ #include "lexicon.h" #include #include +#include #include static const int g_NUM_ROLLED_CUBES = 4; @@ -28,6 +29,16 @@ public: bool isWordLongEnough(const std::string &word) const; bool isWordPlayed(const std::string &word) const; static unsigned int getPointsForWord(const std::string &word); + /** + * @brief computerPlay calculates all possible english words which can be + * formed from the Lexicon recursivly + * @return all possible words of the current board + */ + std::vector computerPlay() const; + +private: + void backtrack(std::vector &validWords, + std::unordered_set &visited, std::string &word) const; private: std::vector m_playedWords;