以下笔记摘自计算机丛书组合数学,机械工业出版社。

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取石子游戏的更多相关文章

  1. 51nod1069【Nim取石子游戏】

    具体看:萌新笔记之Nim取石子游戏可以这么写: #include <bits/stdc++.h> using namespace std; typedef long long LL; in ...

  2. HDU 2516 (Fabonacci Nim) 取石子游戏

    这道题的结论就是,石子的个数为斐波那契数列某一项的时候,先手必败:否则,先手必胜. 结论很简单,但是证明却不是特别容易.找了好几篇博客,发现不一样的也就两篇,但是这两篇给的证明感觉证得不清不楚的,没看 ...

  3. poj2368 Buttons Nim取石子游戏

    链接:http://poj.org/problem?id=2368 和前面差距还是很大啊囧 代码: k,a;main(i){,i=;i<=k/&&k%i;++i);k%i||(a ...

  4. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]

    小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问你他是否有必胜策略,如 ...

  5. bzoj 1413 [ZJOI2009]取石子游戏

    1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 747  Solved: 490[Submit][Statu ...

  6. bzoj 1874 取石子游戏 题解 &amp; SG函数初探

    [原题] 1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 334  Solved ...

  7. vijos 1557:bzoj:1413: [ZJOI2009]取石子游戏

    Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...

  8. 【刷题】BZOJ 1413 [ZJOI2009]取石子游戏

    Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...

  9. bzoj1413 [ZJOI2009]取石子游戏

    Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...

随机推荐

  1. 题解 P4799 【[CEOI2015 Day2]世界冰球锦标赛】

    题解 P4799 [[CEOI2015 Day2]世界冰球锦标赛] 双向搜索好题 传送门 实际上,双向搜索就是把\(a^n\)的复杂度转变成了大多为\(O(nlogna^{\frac{n}{2}})\ ...

  2. DAICO模式到底是什么?

    自从V神提出DAICO以来,已经有项目围绕DAICO模式落地,但是DAICO到底是什么呢? 所谓DAIC0,其实就是DAO+IC0. DAO是DistributedAutonomous Organiz ...

  3. IOS UIlabel 、UIButton添加下划线

    1.给UILabel 添加下划线 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )]; label.backgrou ...

  4. swift实现AES解密

    原来的加密解密是用java写的,用在安卓系统上.现在要用在iOS系统上,所以从服务器上下载过来的加密文件要用swift来实现其的解密方法. 具体过程如下: 给NSData增加一个类目,NSData+A ...

  5. 小米系列手机调试Installation failed with message Failed to establish session

    用Android studio 2.3调度程序时提示"Installation failed with message Failed to establish session"错误 ...

  6. 关于NIO编程

    NIO概述 什么是NIO? Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式. Ja ...

  7. SecureCRT连接Ubuntu失败(远程系统拒绝访问)

    SecureCRT连接Ubuntu失败,长时间的重新连接,连接不了. Ubuntu默认未安装ssh远程加密连接服务. 使用命令,安装即可. sudo apt-get install openssh-s ...

  8. 鸟哥的linux私房菜 - 第三章 主机规划与磁盘分区

    各硬件装置在linux中的文件名 在linux系统中,每个装置都被当成一个档案来对待. 常见的装置与其在linux中的档名: 磁盘分区 磁盘链接的方式与装置文件名的关系 个人计算机常见的磁盘接口有两种 ...

  9. 分享知识-快乐自己:Struts2(动态方法、动态结果、通配符、方法内部跳转、action跳转、OGNL 的使用及注意事项)

    这里主要以案例演示:涵盖以下知识点 1.动态方法调用:使用关键 符号 ! 进行操作   例如:/命名空间 ! 方法名 2.动态结果集:就是说,通过后台返回的结果 ${} 获取,重定向到符合预期的页面. ...

  10. CentOS 7编译安装Tengine+PHP+MariaDB全程笔记

    安装环境:CentOS7 3.10.0-693.5.2.el7.x86_64 准备源码包: pcre-8.41.tar.gz openssl-1.0.1h.tar.gz zlib-1.2.11.tar ...