【问题标题】:storing and processing word families in Evil Hangman game using c++使用 C++ 在 Evil Hangman 游戏中存储和处理词族
【发布时间】:2014-08-21 21:19:07
【问题描述】:

我正在用 C++ 为 EVIL HANGMAN 编写程序。 我在文本文件中有英文词典。

目前执行的算法步骤是::

(1) 玩家选择单词的长度。
(创建一个新的 txt 文件,其中所有长度为 4 的单词。我们称之为“SelectedWords.txt”)
(2) 玩家选择尝试次数。
(3) 玩家给出一个字母作为选择。

例如,根据步骤 1,如果选择 length=4,则 SelectedWords.txt 将如下所示:


盟友
测试版

交易
其他
飞翔

希望


第三步:如果选择的字母是“E”,那么单词族将如下所示:

_ _ _ _(盟友,酷,好)
_ E _ _(测试版,优惠)
_ _ E _(FLEW)
_ _ _ E(希望)

我已经完美地执行了第 2 步和部分执行了第 3 步。

在第 3 步中,我必须从属于相似词族的“SelectedWords.txt”词中进行选择,然后对它们进行计数。 (我打算使用二维字符串数组来保存具有相似家庭的单词)。我必须选择单词数量最多的单词family,并丢弃所有家庭的其余部分。我应该采取什么方法?

感谢您阅读这么久。

【问题讨论】:

    标签: c++ regex


    【解决方案1】:

    一种可能性是采用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&lt;std::string&gt; 作为值。如果 N 是单词的长度,则元组将是 N-tupel。通过使用std::tupel&lt;bool&gt; tupel 将保存如果有一个'E'在第一位,第二位等等。例如(f 表示假,t 表示真):“ALLY”对应于家庭(f,f,f,f),因为每个字母都不是“E”。 “BETA”对应(f,t,f,f),“FLEW”对应(f,f,t,f),以此类推。对于每个单词,您创建相应的tupel,并使用tupel 作为键在map(即家庭)的适当位置插入单词。

    编辑:我不是百分百确定,但可能是元组不能用作 std::map 的键,因为它们是不可散列的对象(需要散列键以提供快速查看-在地图内)。或者,您可以使用相同的想法使用 std::string 作为键。而不是元组(f,f,f,f),您只需使用"0000"(f,t,f,f) 将转到"0100",依此类推。在这里您不必使用1s 和0s,但您可以使用任何您希望的编码(例如"False,True,False,False" 或类似的东西)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多