取石子游戏
Posted willendless
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了取石子游戏相关的知识,希望对你有一定的参考价值。
【题目描述】
给出两堆石子数目,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍.最后谁能够把一堆石子取空谁就算赢.
【题目链接】
http://noi.openjudge.cn/ch0205/6266/
【算法】
- 当前状态总可以用(a,b)表示,其中a = n*b + c,则共有三种情况:
- c = 0, 则当前手赢
- n>=2, 由于对任意一种状态输赢是确定的,那么按当前手取到(b,c)状态对于当前手的输赢情况进行区分。若(b,c)状态会让当前手赢,则最优取法自然是n*b;反之,若当前手取到(b,c)会输,那么显然对方取到(b,c)也会输,所以当前手的最优取法自然是(n-1)*b。所以不论哪种情况,当前手的最优取法都能让他赢。
- 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; }
以上是关于取石子游戏的主要内容,如果未能解决你的问题,请参考以下文章