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

取石子游戏

时间:2015-10-26 22:18:52      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述

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

25 7 --> 11 7 --> 4 7 --> 4 3 --> 1 3 --> 1 0
  选手1取   选手2取   选手1取   选手2取   选手1取

最后选手1(先取的)获胜,在取的过程中选手2都只有唯一的一种取法。 
给定初始时石子的数目,如果两个人都采取最优策略,请问先手能否获胜。

 

输入
输入包含多数数据。每组数据一行,包含两个正整数a和b,表示初始时石子的数目。
输入以两个0表示结束。
输出
如果先手胜,输出"win",否则输出"lose"
样例输入
34 12
15 24
0 0
样例输出
win
lose
提示
假设石子数目为(a,b)且a >= b,如果[a/b] >= 2则先手必胜,如果[a/b]<2,那么先手只有唯一的一种取法.
[a/b]表示a除以b取整后的值.
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 inline void swap(LL &x,LL &y){
 5     LL tmp;
 6     tmp=x; x=y; y=tmp;
 7 }
 8 LL cnt;
 9 inline void ser(LL,LL);
10 int main(){
11     for(;;){
12         cnt=0;
13         LL a,b;
14         scanf("%lld%lld",&a,&b);
15         if(a==b&&a==0) break;
16         ser(a,b);
17     }
18     return 0;
19 }
20 inline void ser(LL a,LL b){
21     if(a<b) swap(a,b);
22     cnt++;
23     if(double(a)/double(b)>=2.0000||a==b){
24         if(cnt%2==1){
25             cout<<"win"<<endl;
26             return;
27         }
28         else{
29             cout<<"lose"<<endl;
30             return ;
31         }
32     }
33     else{
34         ser(a-b,b);
35     }
36 }

 

取石子游戏

标签:

原文地址:http://www.cnblogs.com/CXCXCXC/p/4912453.html

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