Text Twist游戏使用递归

时间:2014-11-26 21:55:31

标签: c++ recursion backtracking

我正在使用C ++中的递归编写Text Twist游戏。对于开始,我有一个Trie类(包含一个TrieNode类)可供使用。我的程序首先从字典中加载单词并将它们存储在Trie对象中。然后它会提示用户输入一个7个字母的单词。在阅读完所有字母之后,我需要使用递归来查找所有可能的字母组合,这些字母是加载字典(Trie)中的单词。然后将这些可能的单词存储在另一个Trie中并稍后打印出来。每个可能的单词必须至少有3个字母,并且必须在字典中。

我陷入了需要编写递归函数来搜索单词的地方,因为我不知道在这种情况下如何应用递归。有人能给我一个暗示吗?我不需要全面的代码;我只需要有人为我点亮那个小灯泡,这样我就知道从哪里开始了。非常感谢!

P.S。我也做了关于回溯和8-Queen问题的研究,但我仍感到困惑......

这是我的主要计划:

void findWord(int i, const string &word, const Trie&lexion){
    //My question is, what should the base case be?
    //I'm a bit clueless: if I start with this:
    //if(word.length()<=1){
    //      return true;
    //  }
    //  else{
    //      return findWord(i,word.substr(1,word.length()),lexion);
    //  }
    //I know this doesn't make sense; but I'm really lost and don't know where to start.
}

void main(){

    string word;

    Trie lexion = Trie();
    lexion.loadFromFile("ospd.txt");
    word = getWord();//get word from the user

    for (size_t i = 3; i <= 7; i++){
        findWord(i,word,lexion);
    }

}

1 个答案:

答案 0 :(得分:1)

基本上你想把问题分成&#34;我可以用这封信开头一个字吗?&#34;然后递归下降Trie来解决&#34;如果我从这个字母开始,我可以使用其余字母的一个子集从这个节点开始一个单词吗?&#34;,然后转换结果结果是一个更大的问题,&#34;我可以从这个trie的根源开始用这个字符串做什么?&#34;

您的递归函数应该包含字母列表(或向量)和对TrieNode的引用,并且应该返回使用该TrieNode作为根存在的可能单词列表。

终止条件是到达叶节点,其中您返回一个带有单个空字符串的列表,表示您找到了一个单词。递归部分迭代一个单词中的所有剩余字母,并查看其中任何一个是否可能成为单词的一部分,并递归检查每个单词(对不起,这真的很难正确地说出来。)

一些伪代码:

list recursiveFind(list input, node curNode)
    if curNode has no children
        // we found a word!
        return list containing ("") (so the caller knows we found a result instead of failing)
    else
        results = empty list
        foreach letter in list
            if find a node where value == letter 
            recursive_results = recursiveFind(input except for that letter, that node you just found)
            foreach result in recursive_results
                push (letter + result) into results
         return results

我希望这有帮助!