欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

石头取勝秘籍: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;
}