石头取勝秘籍:OpenJudge NOI 2.5 6266取石子游戏详解与代码分享
最编程
2024-02-23 10:34:14
...
解法1:博弈 递归
#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;
}