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

POJ 2348 Euclid's Game 组合游戏

时间:2014-11-21 10:43:42      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:poj   组合游戏   

题目大意:有两个人玩游戏,有两堆石子,每次一个人要从其中一堆石子中拿走一些石子,当出现有一对石子变成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 组合游戏

标签:poj   组合游戏   

原文地址:http://blog.csdn.net/jiangyuze831/article/details/41344475

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