码迷,mamicode.com
首页 > 其他好文 > 详细

取石子游戏

时间:2018-07-21 19:50:12      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:并且   std   ||   ret   问题   color   style   http   dfs   

【题目描述】

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

【题目链接】

    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;
}

 

取石子游戏

标签:并且   std   ||   ret   问题   color   style   http   dfs   

原文地址:https://www.cnblogs.com/Willendless/p/9347649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!