解析:
题目描述
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;
}