取石子游戏

Posted willendless

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了取石子游戏相关的知识,希望对你有一定的参考价值。

【题目描述】

    给出两堆石子数目,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍.最后谁能够把一堆石子取空谁就算赢. 

【题目链接】

    http://noi.openjudge.cn/ch0205/6266/

【算法】

  1. 当前状态总可以用(a,b)表示,其中a = n*b + c,则共有三种情况:
    1. c = 0, 则当前手赢 
    2. n>=2,  由于对任意一种状态输赢是确定的,那么按当前手取到(b,c)状态对于当前手的输赢情况进行区分。若(b,c)状态会让当前手赢,则最优取法自然是n*b;反之,若当前手取到(b,c)会输,那么显然对方取到(b,c)也会输,所以当前手的最优取法自然是(n-1)*b。所以不论哪种情况,当前手的最优取法都能让他赢。
    3. n==1, c != 0,此时当前手只能取b,问题递归到接下去(b,c)的1,2,3情况

【代码】

#include <bits/stdc++.h>
using namespace std;
int a,b;
bool dfs(int x,int y)
{
    if(x%y==0||x/y>1) return 1;
    return !dfs(y,x-y);
}
int main()
{
    while(cin>>a>>b&&a) {
        if(a<b) swap(a,b);
        if(dfs(a,b)) cout<<"win"<<endl;
        else cout<<"lose"<<endl;
    }
    return 0;
}

 

以上是关于取石子游戏的主要内容,如果未能解决你的问题,请参考以下文章

取石子游戏

(HDU - 1527)取石子游戏(斐波那契博弈)

取石子游戏

USTC 1213取石子游戏(尼姆博弈)

I - 取石子游戏

hdu2516 取石子游戏