首页 > 代码库 > POJ 2348 Euclid's Game 组合游戏
POJ 2348 Euclid's Game 组合游戏
题目大意:有两个人玩游戏,有两堆石子,每次一个人要从其中一堆石子中拿走一些石子,当出现有一对石子变成0的时候这个人就输了,另一个人就赢了。给出初始石子有多少,问谁能赢。
思路:基础的组合游戏的判定问题,这个题没有给数据范围,非常的坑爹,据说需要long long。
第一次做组合游戏的题目,想想还有些小激动呢。昨天听同学讲了讲,我来现学现卖一下:
由于组合游戏的公平性,那么:如果一个状态的子状态会使先手必败,那么当前状态的先手必胜;
如果不存在一个子状态会使先手必败,那么当前状态先手必败。
利用这个性质就可以来进行搜索了。
当然不能从小到大搜索,因为小的数据容易出解,所以要从小的开始枚举搜索。之后讨论一下边界条件。
CODE:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; long long a,b; bool Judge(int a,int b) { if(a < b) swap(a,b); if(!b) return false; int end = a / b; for(int i = end; i >= 1; --i) if(!Judge(a - i * b,b)) return true; return false; } int main() { long long x,y; while(scanf("%lld%lld",&x,&y),x + y) printf("%s\n",Judge(x,y) ? "Stan wins":"Ollie wins"); }
POJ 2348 Euclid's Game 组合游戏
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。