0

我看过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

欢迎所有想法?

4

1 回答 1

0

错位的挂钩(color代码中的调用)的数量仍然为 0,因为在以下 ctor 中:

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

int&作者在成员初始化之前重置了值。要解决这个问题,我们可以采用多种方法,但最简单的方法是将colorctorCount中的值重置为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) { }
于 2013-11-15T13:35:23.177 回答