我正在用C ++编写EVIL HANGMAN的程序。 我在一个文本文件中有英文字典。
现在执行的算法步骤是::
(1)玩家选择单词的长度
(创建一个新的txt文件,其中包含长度为4的所有单词。让我们调用它" SelectedWords.txt ")
(2)玩家选择尝试次数
(3)玩家给出一个字母作为选择。
例如,根据步骤1,如果选择长度= 4,那么SelectedWords.txt将如下所示:
ALLY
BETA
COOL
DEAL
ELSE
飞到
GOOD
希望
第3步:如果选择的字母是" E"单词系列看起来像:
_ _ _ _(ALLY,COOL,GOOD)
_ E _ _(BETA,DEAL)
_ _ E _(FLEW)
_ _ _ E(希望)
我完全执行了第2步,部分执行了第3步。
在第3步中,我可以选择" SelectedWords.txt"单词落在类似的单词家族,然后计算它们。 (我打算使用2D字符串数组来保存具有相似系列的单词)。我必须选择最多单词的家庭这个词,并丢弃所有家庭的其余部分。我应该采取什么方法?
感谢您阅读这篇文章。
答案 0 :(得分: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
。如果在第一个位置,第二个位置有“E”,那么使用std::tupel<bool>
tupel
会保存。例如(f表示假,t表示真):“ALLY”对应于族(f,f,f,f)
,因为每个字母都不是'E'。 “BETA”对应(f,t,f,f)
和“FLEW”对应(f,f,t,f)
,依此类推。对于每个单词,您都会创建相应的tupel
,并使用tupel
作为关键字在map
(家庭)中的适当位置插入单词。
(f,f,f,f)
和"0000"
转到(f,t,f,f)
,而不是元组"0100"
,依此类推。在这里,您不必使用1
和0
,但您可以使用您希望的任何编码(例如"False,True,False,False"
或类似的东西)。