两人取石子游戏



析:


题目描述
Alice和Bob在玩一个取石子游戏,规则如下:
1,Alice先手,两人轮流取,每次可以取1/2/4颗。
2,取走最后一颗石子的人胜出。
问题:
1,共有16颗石子时,谁将胜出?
2,共有n (n>=1) 颗石子时,谁将胜出?


分析与解法
考虑Alice的必胜态:
当Alice取完本轮石子后,剩下的石子为3的倍数(3*n),那么无论Bob怎么取,Alice都会赢。
简单解释如下:
①n = 1时,即Alice取完后只剩下3颗,那么无论Bob怎么取,Alice下次取都会取到最后一颗,会赢。
②n >1时,即Alice取完后剩下3*n颗,当Bob取完后,剩下的石子数量总可以表示为:
3*k+1 或 3*k + 2(k >= 0),那么此时Alice可以将剩下的石子数重新变为3的倍数,如此递推下去。
...
最终剩下石子数量变为3。

也就是说,只要Alice取完后,剩下的石子数是3的倍数,那么Alice肯定会赢。
简单的C++实现代码如下:
//头文件 & 命名空间
include

using namespace std;//石子数为n时  判定谁赢void WhoWin(int n)
{    
    //Alice要先取     
   puts(n % 3 == 0? "Bob win" : "Alice win");
}

主函数
int main(void)
{     
   int n;     
   while(cin >> n)     
   {          
       WhoWin(n);     
   }     
   return 0;
}