A26681. 取石子游戏
填空题
困难
知识点
题目描述
取石子游戏
题目描述
有两堆石子,两个人轮流去取。每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍,最后谁能够把一堆石子取空谁就算赢。
比如初始的时候两堆石子的数目是25和7。
25 7 --> 11 7 --> 4 7 --> 4 3 --> 1 3 --> 1 0
选手1取 选手2取 选手1取 选手2取 选手1取
最后选手1(先取的)获胜,在取的过程中选手2都只有唯一的一种取法。
给定初始时石子的数目,如果两个人都采取最优策略,请问先手能否获胜。
输入
输入包含多数数据。每组数据一行,包含两个正整数a和b,表示初始时石子的数目。
输入以两个0表示结束。
输出
如果先手胜,输出"win",否则输出"lose"。
输入样例
34 12
15 24
0 0输出样例
win
lose提示
假设石子数目为(a,b)且a >= b,如果[a/b] >= 2则先手必胜,如果[a/b]<2,那么先手只有唯一的一种取法。[a/b]表示a除以b取整后的值。
参考答案
#include <bits/stdc++.h>
using namespace std;
bool dfs(int a, int b)//a:较多一堆石子的数量 b:较少一堆石子的数量 返回:此时是否先手必胜
{
if(a%b == 0)
return true;//一堆是另一堆的整数倍,此时先手一定可以拿光一堆获得胜利。
if(a/b >= 2)//如果floor(a/b)>=2,那么先手必胜
return true;
else
return !dfs(b, a-b);//下一轮先手是否必胜的情况为dfs(b, a-b),本轮先手的获胜情况与之相反。
}
int main()
{
int a, b;
while(cin >> a >> b)
{
if(a == 0 && b == 0)
break;
if(a < b)
swap(a, b);//保证a较大,b较小
cout << (dfs(a, b) ? "win" : "lose") << endl;
}
return 0;
}
上一题
下一题