POJ 2068 Nim 组合游戏

题目大意:有一堆石子,两伙人,围在一起坐,坐的顺序是ABABABAB。。。。每一个人最多能取a[i]个石子,取走最后一个石子的就输了。问谁能赢。

思路:朴素的组合游戏判定问题,这个题给了数据范围,可以进行记忆化搜索。f[i][j]为还剩下i个石子,到了第j个人的时候的状态,然后记忆化一下。

CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 10010
using namespace std;

int cnt,total,src[30];
int f[MAX][30];

bool Judge(int last,int pos)
{
	if(f[last][pos] != -1)	return f[last][pos];
	if(!last)	return true;
	int next = (pos + 1 > cnt * 2) ? 1:pos + 1;
	for(int i = 1; i <= src[pos] && last - i >= 0; ++i)
		if(!Judge(last - i,next))
			return f[last][pos] = 1;
	return f[last][pos] = 0;
}

int main()
{
	while(scanf("%d",&cnt) && cnt) {
		scanf("%d",&total);
		memset(f,-1,sizeof(f));
		for(int i = 1; i <= (cnt << 1); ++i)
			scanf("%d",&src[i]);
		printf("%d\n",Judge(total,1) ? 1:0);
	}
	return 0;
}

时间: 2024-10-07 21:23:31

POJ 2068 Nim 组合游戏的相关文章

POJ 2068 Nim

链接: http://poj.org/problem?id=2068 题意: 传统的Nim游戏由两名玩家进行,在一堆石头中,双方轮流取走任意合法数量块石头,取走最后一块石头的玩家落败. 多人Nim游戏将参赛人数拓展至两个队伍,每支队伍有n名队员交错入座,单次分别能最多取走Mi块石头,取走S块石头中的最后一块的队伍失败, 求第一支队伍是否有必胜策略? 题解: dp[i][j]表示第i个人取,还有j块石头 . 当j为0的时候,没有石头,这时候是胜,为1. 后继中有必败态的为必胜态. 代码: 31 i

POJ 2068 Nim#双人dp博弈

http://poj.org/problem?id=2068 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[25][(1<<13)+5];//dp[i][j]表示轮到第i个人取时,剩j个石头 int n,s,m[25]; int DFS(int pos,int remain) { if(dp

hdu-5795 A Simple Nim(组合游戏)

题目链接: A Simple Nim Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 181    Accepted Submission(s): 119 Problem Description Two players take turns picking candies from n heaps,the player who picks

poj 2068 Nim(博弈dp)

Nim Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1403   Accepted: 791 Description Let's play a traditional game Nim. You and I are seated across a table and we have a hundred stones on the table (we know the number of stones exactly).

POJ 2068 Nim (dp博弈)

题意: 共n轮,s个石头和两队人,两队人轮流拿,第i轮两队分别只能拿1~M[(2*i-1)%(2*n)]和1~M[(2*i)%(2*n)]个石头,拿到最后那个石头的队输: 就拿最后一组样例来说,循环中共3轮,共97个石头,第一轮两队分别拿不超过8个和7个石头,第二轮6个和5个,第三轮4个和3个,然后又是8个和7个...... Input n S M[1]  M[2] . . . M[2*n] 1 <= n <= 10, 1 <= Mi <= 16, and 1 <= S &l

POJ【数论/组合/博弈论】

 POJ[数论/组合/博弈论]题目列表 POJ[数论/组合/博弈论]题目列表 原来的列表比较水,今天换了一个难一些的列表,重新开始做~ 红色的代表已经AC过,蓝色的代表做了但是还没过.这句话貌似在我空间里的每份列表里都有额. 博弈论 POJ 2234 Matches Game POJ 2975 Nim POJ 2505 A multiplication game POJ 1067 取石子游戏 POJ 2484 A Funny Game POJ 2425 A Chess Game POJ 29

组合游戏 - SG函数和SG定理

在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的性质: 1.所有终结点是 必败点 P .(我们以此为基本前提进行推理,换句话说,我们以此为假设) 2.从任何必胜点N 操作,至少有一种方式可以进入必败点 P. 3.无论如何操作,必败点P 都只能进入 必胜点 N. 我们研究必胜点和必败点的目的时间为题进行简化,有助于

POJ 2348 Euclid&#39;s Game 组合游戏

题目大意:有两个人玩游戏,有两堆石子,每次一个人要从其中一堆石子中拿走一些石子,当出现有一对石子变成0的时候这个人就输了,另一个人就赢了.给出初始石子有多少,问谁能赢. 思路:基础的组合游戏的判定问题,这个题没有给数据范围,非常的坑爹,据说需要long long. 第一次做组合游戏的题目,想想还有些小激动呢.昨天听同学讲了讲,我来现学现卖一下: 由于组合游戏的公平性,那么:如果一个状态的子状态会使先手必败,那么当前状态的先手必胜: 如果不存在一个子状态会使先手必败,那么当前状态先手必败. 利用这

HDU 3404&amp;POJ 3533 Nim积(二维&amp;三维)

(Nim积相关资料来自论文曹钦翔<从"k倍动态减法游戏"出发探究一类组合游戏问题>) 关于Nim积计算的两个函数流程: 代码实现如下: int m[2][2]={0,0,0,1}; int Nim_Multi_Power(int x,int y) { if(x<2) return m[x][y]; int a=0; for(;;a++) if(x>=(1<<(1<<a))&&x<(1<<(1<<