GoW上的Mastermind C ++

时间:2013-11-14 16:01:43

标签: c++

我看了that article on Guru Of the Week,其中提出了一个“纯粹的”C ++解决方案来计算主谋游戏中精确和错位的挂钩的数量,比较猜测和隐藏的代码。

但是当我使用代码时

string colors("BGR"), comb(4, '.'), l(comb), guess;
typedef map<int,int> M;

struct Color
{
    Color( M& cm, M& gm, int& color )
        : cm_(cm), gm_(gm), color_(color=0) { }

    void operator()( char c )
    {
        color_ += min( cm_[c], gm_[c] );
    }
    M &cm_, &gm_;
    int& color_;
};

struct Count
{
    Count( int& color, int& exact )
        : color_(color), exact_(exact=0) { }

    char operator() ( char c, char g )
    {
        return ++cm_[c], ++gm_[toupper(g)], exact_ += c == toupper(g), '.';
    }

    ~Count()
    {
        for_each( colors.begin(), colors.end(), Color( cm_, gm_, color_ ) );
    }

    M cm_, gm_;
    int &color_, &exact_;
};

char ChoosePeg()
{
    return colors[rand() % colors.size()];
}

int main()
{
    int color, exact = 0;
    srand( time(0) ), generate( comb.begin(), comb.end(), ChoosePeg );

    while( exact < comb.length() )
    {
        cout << "\n\nguess--> ", cin >> guess;
        transform( comb.begin(), comb.end(),
               guess.begin(), l.begin(),
               Count( color, exact ) );
         cout << color << ' ' << exact;
     }
     cout << " - solved!\n";
 }

“颜色”编号始终为0,即使它们应该与它们提供的示例不同。我硬编码了代码组合“RRBB”,当我输入“rbrr”时,预期的结果是:3 1,但我的输出是:

guess--> rbrr
0 1

欢迎所有的想法?

1 个答案:

答案 0 :(得分:0)

错误的挂钩数量(代码中的呼叫color)仍为0,因为在以下ctor中:

Color( M& cm, M& gm, int& color )
        : cm_(cm), gm_(gm), color_(color=0) { }

作者在成员初始化之前重置int&值。 要解决此问题,我们可以采用多种方式,但最简单的方法是重置color ctor中的Count值和exact值。因此ColorCount构造函数变为:

Color( M& cm, M& gm, int& color )
        : cm_(cm), gm_(gm), color_(color) { }

Count( int& color, int& exact )
        : color_(color = 0), exact_(exact=0) { }