测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A26681. 取石子游戏

填空题 困难

题目描述

取石子游戏

题目描述

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

比如初始的时候两堆石子的数目是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取整后的值。

参考答案

#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; }
上一题 下一题