使用C++存储和处理Evil Hangman游戏中的单词族。

3
我正在用C++编写EVIL HANGMAN程序。我有一个英语词典文本文件。
已执行的算法步骤如下:
(1) 玩家选择单词长度。(将创建一个新的txt文件,其中包含所有长度为4的单词。命名为"SelectedWords.txt")
(2) 玩家选择尝试次数。
(3) 玩家选择字母作为猜测。
例如,根据第一步,如果选择长度为4,则"SelectedWords.txt"内容将如下所示:
ALLY BETA COOL DEAL ELSE FLEW GOOD HOPE
第三步: 如果选择的字母是"E",则单词族将如下所示:
_ _ _ _(ALLY,COOL,GOOD) _ E _ _(BETA,DEAL) _ _ E _(FLEW) _ _ _ E(HOPE)
我已经完美地执行了第二步和部分地执行了第三步。
在第三步中,我必须从"SelectedWords.txt"中选择属于类似单词族的单词,并计算它们。 (我打算使用2D字符串数组来保存具有相似单词族的单词)。我必须选择具有最大单词数的单词族并丢弃所有其他族。我应该采取什么方法?
谢谢您耐心阅读这篇文章。
1个回答

0
一种可能性是使用std::vector< std::vector<std::string> >,其中外部向量存储家族,内部向量存储家族中包含的单词。您可以按以下方式使用它(简化,每个单词最多包含一个特定字母的出现):
int word_length = 4;
vector< vector<string> > families(word_length+1,vector(0,string()));
/* parse your .txt file or the previous list here and insert words in the appropriate vector contained by family */
/* that means if the letter is at the n-th position you insert in families[n], if the letter is not contained it comes in families[0] */
//checking for the largest family:
unsigned int max = 0, max_index;
for(unsigned int ii=0; ii<families.size(); ii++)
{
    if(families[ii].size() > max) {
        max = families[ii].size();
        max_index = ii;
    }
}
//then you keep the vector at position max_index and this will be the starting point for estimating subsequent families;

由于单词中的一个字母可能出现不止一次,因此您需要扩展家族向量的大小。要获取可能出现的次数,您可以使用二项式系数(http://en.wikipedia.org/wiki/Binomial_coefficient),并将它们相加以获得所有出现次数的数量(即从1到word_length-1,因为单词不仅由一个字母组成)。在这里,您必须确定家族向量内的排序方式(首先是没有出现,然后是所有1次出现,然后是所有2次出现,依此类推)。

或者您可以使用 std::map,并将 std::tupel 用作键,将 std::vector<std::string> 用作值。如果 N 是单词的长度,则 tupel 将是一个 N-tupel。通过使用 std::tupel<bool>tupel 将保存是否在第一位、第二位等处有 'E'。例如(f 表示 false,t 表示 true):"ALLY" 对应于家族 (f,f,f,f),因为每个字母都不是 'E'。"BETA" 对应于 (f,t,f,f),"FLEW" 对应于 (f,f,t,f),依此类推。对于每个单词,您创建相应的 tupel,并将单词插入到适当位置的 map(即 families)中,使用 tupel 作为键。

编辑:我不是百分之百确定,但可能情况是元组不能用作std::map的键,因为它们是非可哈希对象(在映射中提供快速查找所需对键进行哈希)。或者您可以使用std::string作为键,使用相同的想法。而不是一个元组(f,f,f,f),您只需取"0000"(f,t,f,f)将转到"0100"等等。在这里,您不必使用10,而可以使用任何您希望的编码(例如"False,True,False,False"或类似内容)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接