我看了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
欢迎所有的想法?
答案 0 :(得分:0)
错误的挂钩数量(代码中的呼叫color
)仍为0,因为在以下ctor中:
Color( M& cm, M& gm, int& color )
: cm_(cm), gm_(gm), color_(color=0) { }
作者在成员初始化之前重置int&
值。
要解决此问题,我们可以采用多种方式,但最简单的方法是重置color
ctor中的Count
值和exact
值。因此Color
和Count
构造函数变为:
Color( M& cm, M& gm, int& color )
: cm_(cm), gm_(gm), color_(color) { }
和
Count( int& color, int& exact )
: color_(color = 0), exact_(exact=0) { }