Nim
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 1501   Accepted: 845

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). We play in turn and at each turn, you or I can remove on to four stones from the heap. You play first and the one who removed the last stone loses.
In this game, you have a winning strategy. To see this, you first
remove four stones and leave 96 stones. No matter how I play, I will end
up with leaving 92 - 95 stones. Then you will in turn leave 91 stones
for me (verify this is always possible). This way, you can always leave
5k+1 stones for me and finally I get the last stone, sigh. If we
initially had 101 stones, on the other hand, I have a winning strategy
and you are doomed to lose.

Let's generalize the game a little bit. First, let's make it a team
game. Each team has n players and the 2n players are seated around the
table, with each player having opponents at both sides. Turn around the
table so the two teams play alternately. Second, let's vary the maximum
number of stones each player can take. That is, each player has his/her
own maximum number of stones he/she can take at each turn (The minimum
is always one). So the game is asymmetric and may even be unfair.

In general, when played between two teams of experts, the outcome of
a game is completely determined by the initial number of stones and the
maximum number of stones each player can take at each turn. In other
words, either team has a winning strategy.

You are the head-coach of a team. In each game, the umpire shows
both teams the initial number of stones and the maximum number of stones
each player can take at each turn. Your team plays first. Your job is,
given those numbers, to instantaneously judge whether your team has a
winning strategy.

Incidentally, there is a rumor that Captain Future and her officers
of Hakodate-maru love this game, and they are killing their time playing
it during their missions. You wonder where the stones are? Well, they
do not have stones but do have plenty of balls in the fuel containers!

Input

The
input is a sequence of lines, followed by the last line containing a
zero. Each line except the last is a sequence of integers and has the
following format.

n S M1 M2 . . . M2n

where n is the number of players in a team, S the initial number of
stones, and Mi the maximum number of stones ith player can take. 1st,
3rd, 5th, ... players are your team's players and 2nd, 4th, 6th, ... the
opponents. Numbers are separated by a single space character. You may
assume 1 <= n <= 10, 1 <= Mi <= 16, and 1 <= S < 2^13.

Output

The output should consist of lines each containing either a one, meaning your team has a winning strategy, or a zero otherwise.

Sample Input

1 101 4 4
1 100 4 4
3 97 8 7 6 5 4 3
0

Sample Output

0
1
1

Source

【思路】

博弈

构造博弈树,一个局面必胜当且仅当后继局面有至少一个必败局面,一个局面必败当且仅当后继局面都为必胜局面。

记忆化搜索即可。

【代码】

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; const int N = 1e4; int f[][N],a[];
int n,m; int dfs(int r,int tot) {
if(r==*n+) r=;
int &ans=f[r][tot];
if(ans!=-) return ans;
if(tot==) return ans=;
if(tot<=a[r]) return ans=;
FOR(i,,a[r])
if(!dfs(r+,tot-i)) return ans=;
return ans=;
} int main() {
while(scanf("%d",&n)== && n) {
scanf("%d",&m);
FOR(i,,*n) scanf("%d",&a[i]);
memset(f,-,sizeof(f));
if(dfs(,m)) puts("");
else puts("");
}
return ;
}

poj 2068 Nim(博弈树)的更多相关文章

  1. poj 2068 Nim

    Nim POJ - 2068 题目大意:多组数据,两人轮流操作,n轮一循环,给出总石子数和这n轮每次两人能取的石子上限(下限为1).取到最后一颗者输. /* f[i][j]表示在第i轮中一共有j个石子 ...

  2. POJ 2068 Nim#双人dp博弈

    http://poj.org/problem?id=2068 #include<iostream> #include<cstdio> #include<cstring&g ...

  3. POJ 2068 Nim(博弈论)

    [题目链接] http://poj.org/problem?id=2068 [题目大意] 给出两队人,交叉放置围成一圈,每个人能取的石子数有个上限,各不相同 轮流取石头,取到最后一块石头的队伍算输,问 ...

  4. poj 2068 Nim(博弈dp)

    Nim Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1403   Accepted: 791 Description Le ...

  5. poj 2068 Nim 博弈论

    思路:dp[i][j]:第i个人时还剩j个石头. 当j为0时,有必胜为1: 后继中有必败态的为必胜态!!记忆化搜索下就可以了! 代码如下: #include<iostream> #incl ...

  6. POJ 2068 NIm (dp博弈,每个人都有特定的取最大值)

    题目大意: 有2n个人,从0开始编号,按编号奇偶分为两队,循环轮流取一堆有m个石子的石堆,偶数队先手,每个人至少取1个,至多取w[i]个,取走最后一个石子的队伍输.问偶数队是否能赢. 分析: 题目数据 ...

  7. HDU 3404&POJ 3533 Nim积(二维&三维)

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

  8. POJ 2975 Nim(博弈论)

    [题目链接] http://poj.org/problem?id=2975 [题目大意] 问在传统的nim游戏中先手必胜策略的数量 [题解] 设sg=a1^a1^a3^a4^………^an,当sg为0时 ...

  9. [原博客] POJ 2975 Nim 统计必胜走法个数

    题目链接题意介绍了一遍Nim取石子游戏,可以看上一篇文章详细介绍.问当前状态的必胜走法个数,也就是走到必败状态的方法数. 我们设sg为所有个数的Xor值.首先如果sg==0,它不可能有必胜走法,输出0 ...

随机推荐

  1. [Mime] MimeHeaders--MimeHeader帮助类 (转载)

    点击下载 MimeHeaders.rar 这个类是关于Mime的Headers类看下面代码吧 /// <summary> /// 类说明:Assistant /// 编 码 人:苏飞 // ...

  2. javascript类继承系列四(组合继承)

    原理: 结合了原型链和对象伪装各自优点的方式,基本思路是:使用原型链继承原型上的属性和方法,使用对象伪装继承实例属性,通过定义原型方法,允许函数复用,并运行每个实例拥有自己的属性 function B ...

  3. SQL Server 损坏修复

    目录: 一. 常见错误解读 二. DBCC CHECKDB 三 .不同部位损坏的应对 四. Database Mirroring和AlwaysOn的页面自动修复功能 一 常见错误解读 SQL Serv ...

  4. Stream To String , String To Stream

    public static string StreamToString(Stream stream) { stream.Position = 0; using (StreamReader stremR ...

  5. PHP语言、浏览器、操作系统、IP、地理位置、ISP

    )]; } else { $Isp = 'None'; } return $Isp; }}

  6. 关于通过bindService启动的service,在unbindService后service是否继续运行的讨论

    有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定.具体的启动情况有下: 1.当启动时,单独调用bindService方法,在unbindService后,会 ...

  7. 函数还能这样玩儿~实现类似add(1)(2)(3)的函数

    人生的第一份前端工作找到了,感谢大神主子们给半路出家自学的我这么多的机会,很高兴正式踏上客观又乐趣满满的程序员之路,哇咔咔咔. ​ 分享一个准备面试时遇到的一个有趣的问题: 要求实现类似add(1)( ...

  8. MVVM模式应用 之为ApplicationBarIconButton 添加Command操作属性

    在学习MVVM的过程中,总是会遇到挫折,一碰到就是花费好长时间去解决..唉,不求量,只求质. 第一种(已经实践成功): (1)http://bindableapplicationb.codeplex. ...

  9. 学习Swift -- 数组(Array) - 持续更新

    集合类型--数组 Array是Swift中的一种集合类型:数组,数组是使用有序列表储存同一类型的多个值,与OC的NSArray的最大不同是,Swift的数组是值类型,OC的数组是引用类型 声明数组的方 ...

  10. 字符串搜索算法Boyer-Moore

    整理日: 2015年2月16日 1. 主要特征 假设文本串text长度为n,模式串pattern长度为m,BM算法的主要特征为: 从右往左进行比较匹配(一般的字符串搜索算法如KMP都是从从左往右进行匹 ...