Nim博弈游戏
给定n堆石子,每次每人能从一堆石子中取若干个石子(不能不取),最后不能取石子者败
对于这个游戏,我们要判断的是,给定局势下,先手者胜还是败
设先手胜的局势为N-postion,先手败的局势为P-postion
可以移动到P-postion的局势叫做N-postion,只能移动到N-postion的局势叫做P-postion。
1、只有一堆的情况下先手胜
2、只有两堆
a、数目相等的局势,先手败,因为不管先手怎么取,后手都能在另一堆中复制先手的取法
b、数目不相等的局势,先手胜,先手可以在石子多的那一堆取走一定的石子,使得两堆的石子数相等,然后参考情况a分析,可知先手胜
3、两堆以上的情况。将局势分为两个子局势x,y
那么来分析一下局势的加法与异或之间的关系,
将局势分为两个子局势n和m,如果两个子局势相同,则表示n==m,将局势如果可以先手胜利,成为n胜或m胜
局势异或等于0,表示先手败,不等于0,表示先手胜
若n胜m胜 如果n==m ,n^m==0, 如果n!=m, n^m!=0 ,说明该情况下的局势加法满足异或
若n胜m负 先手者在n局势先手获得胜利,然后使得后手者在m局势先手,获得失败,所以先手胜 n!=0,m==0, n^m!=0,说明该情况下的局势加法满足异或
若n负m胜 同上
若n负m负 先手者在n局势取得失败,然后又在m局势先手取得使得,所以最终失败。 n==0,m==0,n^m==0, 说明该情况下的局势加法满足异或
所以Nim游戏的判断是否先手胜就变成了判断n堆石子的异或是否不等于0
那么怎么获得必胜策略是怎么走的呢?即将某堆得石子取走k个,使得的石子异或等于0
设有n堆石子,a1,a2,...ai...an
对于ai,取得另外n-1堆得石子的异或s
如果 ai > s , 那么k= ai - s, 这样子 (ai-k)==s 即 ai^s==0
Nim博弈游戏的更多相关文章
- hihocoder 1163 博弈游戏·Nim游戏
1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样的 ...
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 取火柴游戏||Nim博弈
好久之前看的sg函数了 好像就记住一个nim博弈qwq 第一次啊看的时候很迷,现在感觉可以了qwq 首先我们来看一个其他的游戏.(以下游戏只有两个人参与,且足够聪明) 两个人在一张圆形的桌子上放等大的 ...
- hiho一下 第四十五周 博弈游戏·Nim游戏·二 [ 博弈 ]
传送门 题目1 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面 ...
- 取(m堆)石子游戏 HDU2176(Nim博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 题目: Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜. ...
- HDU 2176 取(m堆)石子游戏 —— (Nim博弈)
如果yes的话要输出所有情况,一开始觉得挺难,想了一下也没什么. 每堆的个数^一下,答案不是0就是先取者必胜,那么对必胜态显然至少存在一种可能性使得当前局势变成必败的.只要任意选取一堆,把这堆的数目变 ...
- Nowcoder 挑战赛23 B 游戏 ( NIM博弈、SG函数打表 )
题目链接 题意 : 中文题.点链接 分析 : 前置技能是 SG 函数.NIM博弈变形 每次可取石子是约数的情况下.那么就要打出 SG 函数 才可以去通过异或操作判断一个局面的胜负 打 SG 函数的时候 ...
- HDU 2509 Nim博弈变形
1.HDU 2509 2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...
- 博弈论中的Nim博弈
瞎扯 \(orzorz\) \(cdx\) 聚聚给我们讲了博弈论.我要没学上了,祝各位新年快乐.现在让我讲课我都不知道讲什么,我会的东西大家都会,太菜了太菜了. 马上就要回去上文化课了,今明还是收下尾 ...
随机推荐
- Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)
前几天在CSDN社区看到一篇<如何得到自身单元名称>的帖子,其中一位名为sdzeng网友给出了答案.受此启发,自己写了一个函数,用来获取指定类的所有祖先类的名称及其所在的单元名称. //参 ...
- C++ operator overload -- 操作符重载
C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 # ...
- 用百度API实现热(WIFI)、GPS、基站定位
直接在代码.. .嘎嘎 /** * 百度基站定位错误返回码 */ // 61 : GPS所在地结果 // 62 : 扫描整合的基础上有针对性的失败.在这一点上的定位结果无效. // 63 : 网络异常 ...
- haproxy配置监控redis主备切换(转)
环境前提: redis sentinel配置,三台主机,且配置运行良好 配置文件中添加: frontend ft_redis bind 0.0.0.0:6379 name re ...
- How do I create a zip file?(转)
Creating a zip file is a task that can easily be accomplished by using the classes ZipOutputStream a ...
- JavaScript学习总结1
/***我是切割线 的開始***/ //利用prototype属性能够加入公有属性和方法 function myConstructor2(){ this.a='大灰狼'; }; //声明构造函数,能够 ...
- 纯C语言INI文件解析
原地址:http://blog.csdn.net/foruok/article/details/17715969 在一个跨平台( Android .Windows.Linux )项目中配置文件用 IN ...
- EJBCA 在windows上的安装
为了做EJBCA的封装測试,在我自己电脑上装了个,可是在国内的开发上面的介绍实在是太少.有的也仅仅是些傻瓜式的安装介绍,这是介绍在Windows上安装的过程,(后面介绍下 linux 红帽上的),有些 ...
- GIT的下载、安装、与使用
一.下载: 网址:https://code.google.com/p/msysgit/ 进入这个网站以后,你会看到以下界面: 在这个界面中找到: 这时你便可以下载GIT 二.安装 安装过程比较简单,一 ...
- 南阳OJ 16 矩形嵌套
描写叙述 有n个矩形,每个矩形能够用a,b来描写叙述,表示长和宽. 矩形X(a,b)能够嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度). ...