萌新笔记之Nim取石子游戏
以下笔记摘自计算机丛书组合数学,机械工业出版社。
Nim取石子游戏
Nim(来自德语Nimm!,意为拿取)取石子游戏。
前言:
哇咔咔,让我们来追寻娱乐数学的组合数学起源!
游戏内容:
有两个玩家面对若干堆东西(硬币,石子,豆子···)进行游戏。设有k≥1堆硬币,各堆分别含有n1,n2...nk枚硬币。
游戏规则:
(1):游戏中两个人交替进行游戏(我们称第一个取的为1号,第二个取的为2号)。
(2):当玩家取石子的时候,先选择硬币中的一堆,然后可以从堆中取走任意数量的硬币。
当所有的堆为空时,游戏结束。最后取子者(即能够取走最后一堆中剩下的所有硬币)获胜。
注意:游戏是明智进行的,即两个玩家都是以自己最优进行的。What should I do?我也很无奈呀。
不要纠结就是上呀:
我们先考虑特殊情况(这是一般求解问题的重要原则:为了深入理解呵强化直觉力,往往考虑小的或特殊清形。然后,为了一般地解决问题再努力扩展你的想法,感觉这个对构造问题也是很有帮助)。
特殊情况:
如果一开始只有一堆(n1):那么1号取完n1,win,游戏结束。
如果一开始只有两堆(n1,n2):那么对于1号来说,他不关心n1,n2,他关心的是n1,n2是否相等。
如果n1≠n2,那么1号取多的那一堆,使得两堆相等,等2号来取的时候,2号取完只会产生两种情况:①:存在两堆不相等 ②:只有一堆了。
对于②:一号win,游戏结束。
对于①,一号继续构造成两堆相等,一直如此,会变成状态②,一号win.
讲到这里还是蛮简单的嘛~
好,我们去考虑一般情况!拿起纸和笔一起啊~
哦,等等我说个过渡,太直接感觉不好。
过渡:
我们知道对于一个十进制数,都有一个对应的二进制数,比如11:1011。我把每堆分成几个子堆(其实没分!其实没分!其实没分!只是我们假想分了!),怎么分呢?
就是应用刚刚说的拆成2的非负次幂的数[1(2^0),2(2^1),4(2^2)....2^x],11就拆成了8+2+1=11.
有什么用呢?
在2-堆 Nim取石子游戏中,各种大小的子堆的总数只能是0,1,2(废话,总共只有2堆)。
考虑各种大小的子堆的总堆数是偶数是什么情况?那么不就是两个堆相等嘛,2号赢的情况!我相信,在这里感觉来了,如果前提不是2-堆而是k-堆,而各种大小的子堆的总堆数都是偶数?(希望我不是沉浸在自己的世界里)
重点:
现在考虑各堆大小为n1,n2...nk的一般Nim取石子游戏。将每一个数ni表示成2的非负次幂的数(11->1011)
我们说(不是我说的,是数学家说的)Nim取子游戏是平衡的。(这里跨度有点大,但是感觉这里还是自己理解就好。)
于是我们有1号能够在非平衡Nim取子游戏中取胜,2号能够在平衡Nim取子游戏中取胜。
如果局势是非平衡的状态,那么1号可以从一个堆中取石子,留给2号平衡的状态。而2号怎么做都会构成非平衡状态,从而1号win;反之,同理。
我们举个例子,有4个堆:7,9,12,15
| 堆大小 | 2^3=8 | 2^2=4 | 2^1=2 | 2^0=1 |
| 7 | 0 | 1 | 1 | 1 |
| 9 | 1 | 0 | 0 | 1 |
| 12 | 1 | 1 | 0 | 0 |
| 15 | 1 | 1 | 1 | 1 |
显然是非平衡的,3位,2位,0位非平衡,也就是1号会赢。
那么也就是说1号怎么搞构造成平衡呢?
有:
从12选11,剩:0001,满足
从9取5, 剩:0100,满足
从15取13,剩0010,满足
that's all, thanks!
萌新笔记之Nim取石子游戏的更多相关文章
- 51nod1069【Nim取石子游戏】
具体看:萌新笔记之Nim取石子游戏可以这么写: #include <bits/stdc++.h> using namespace std; typedef long long LL; in ...
- HDU 2516 (Fabonacci Nim) 取石子游戏
这道题的结论就是,石子的个数为斐波那契数列某一项的时候,先手必败:否则,先手必胜. 结论很简单,但是证明却不是特别容易.找了好几篇博客,发现不一样的也就两篇,但是这两篇给的证明感觉证得不清不楚的,没看 ...
- poj2368 Buttons Nim取石子游戏
链接:http://poj.org/problem?id=2368 和前面差距还是很大啊囧 代码: k,a;main(i){,i=;i<=k/&&k%i;++i);k%i||(a ...
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]
小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问你他是否有必胜策略,如 ...
- bzoj 1413 [ZJOI2009]取石子游戏
1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 747 Solved: 490[Submit][Statu ...
- bzoj 1874 取石子游戏 题解 & SG函数初探
[原题] 1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 334 Solved ...
- vijos 1557:bzoj:1413: [ZJOI2009]取石子游戏
Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...
- 【刷题】BZOJ 1413 [ZJOI2009]取石子游戏
Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...
- bzoj1413 [ZJOI2009]取石子游戏
Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...
随机推荐
- Hadoop集群部署-Hadoop 运行集群后Live Nodes显示0
可以尝试以下步骤解决: 1 ,分别删除:主节点从节点的 /usr/local/hadoop-2.6.2/etc/tmp 下得所有文件; 2: 编辑cd usr/local/hadoop-2.6. ...
- SAP采购寄售业务操作步骤
[转自 http://blog.sina.com.cn/s/blog_6466e5f70100jghg.html] 这里所示的是比较完整的步骤,包含了:信息记录.采购合同.货源清单.采购申请.采购订单 ...
- linux卸载软件
rpm -q -a 查询当前系统安装的所有软件包 rpm -e 软件包名 参数e的作用是使rpm进入卸载模式,对名为某某某的软件报名进行卸载 rpm -e 软件包名 -nodeps 由于系统中各个软件 ...
- 升级pip3的正确姿势
如果你的电脑里装了两个python,就会有两个pip,一个是pip2,一个是pip3,还有可能出现一个既没有2也没有3的pip,一般情况下,pip等于pip2 有时候我们使用pip安装东西会提示我们p ...
- Database: key
super-key: Any key that has more columns than necessary to uniquely identify each row in the table i ...
- python 安装coreml
2.安装pip, 下载get-pip.py, https://bootstrap.pypa.io/get-pip.py,然后Python 这个文件,如果没有权限就加sudo 3.安装coreml:这 ...
- chunkhash笔记
假设有main1.main2两个入口文件,main引入chunk1.chunk2,main2引入chunk1 改变chunk2 main1的chunkhash改变,main2不发生改变 main再引入 ...
- 《CSS权威指南(第三版)》---第六章 文本属性
本章主要的内容是: 1.文本缩进: text-indent.行内元素无法缩进,一般用左内边距或外边距来创造这种效果. 2.文本对齐:text-align .只应用于块状元素. 3.行高:一般line- ...
- 吴恩达机器学习笔记(八) —— 降维与主成分分析法(PCA)
主要内容: 一.降维与PCA 二.PCA算法过程 三.PCA之恢复 四.如何选取维数K 五.PCA的作用与适用场合 一.降维与PCA 1.所谓降维,就是将数据由原来的n个特征(feature)缩减为k ...
- 杂草丛生HTML5网站模板
杂草丛生HTML5个人网站模板是一款野草到处生长的HTML5网站模板下载. 模板地址:http://www.huiyi8.com/sc/8780.html