[学习笔记]nim游戏
普通nim游戏:
n堆石子,每个人每次对着一堆拿若干个。不能拿者判输。
只有两种情况,先手必胜,先手必败。
先手必胜当且仅当:a1^a2^...^an!=0
证明:
设=x(x不为0),选择最高位和x一样的ai,显然有ai^x<ai
阶梯型nim游戏
阶梯型nim游戏:高度单调的阶梯。每次只能把a[i]中选择x个,放到a[i-1]中,或者把a[1]中扔掉若干个。问有无先手必胜策略。
等价于对奇数堆做nim游戏。
第一次先手,就把奇数堆按照必胜策略移动。偶数堆不管,当做垃圾桶。
如果后手移动奇数堆到偶数堆,就按照奇数堆必胜策略移动。
反之,就把后手移动过来x的奇数堆再往前移动x个。对于奇数堆的状态不变。早晚会把偶数堆移动完。
所以,等价。
反向nim游戏
有 N 堆石子,每次可从一堆石子中拿走任意数量的石子。
两个人轮流拿,谁不能拿谁赢。
上面的必胜和必败都是基于“无法操作者败”这个规则来解释的。
若某组合游戏的胜利条件是“无法操作者胜”的话,必胜态必须满足二者之一:
SG异或和>0且石子数>1的堆数>0
SG异或和=0且石子数>1的堆数=0
证明。。。
Nim-K 游戏
有 N 堆石子,每次可从 K 堆石子中拿走任意数量的石子。
两个人轮流拿,谁不能拿谁输。

证明:
数学归纳法
1.没有石子的时候,一定全部为0
2.如果当前全部为0,最多某一位1的个数变化k个,一定不会全部为0
3.如果当前不全为0,从高位开始往低位找,
如果某一位1的个数为b,之前已经动过的堆数为c,先用c个动过的堆来调整,让b变成0或者k+1,不够用,就从剩下的b的堆把1删去(大概就是先都往0凑,加上新选择的堆还不行的话,那么一定可以直接凑出k+1,直接用c个原来的堆往k+1凑)
删去1的堆一定已经取走,所以后面就可以随便0->1或者1->0了,加入那c个。如果能操作k个,那么一定可以随心所欲了。
证毕。
小例题:


两人之间的距离就是石子数量。都撞上了以后,谁撤,对面立刻怼上去。
[学习笔记]nim游戏的更多相关文章
- cocos2d-x学习笔记(18)--游戏打包(windows平台)
		cocos2d-x学习笔记(18)--游戏打包(windows平台) 之前做好的游戏,都是在vs2008下编译执行的.假设说想把游戏公布到网上或者和其它人一起分享游戏,那就得对游戏 ... 
- python学习笔记 | 猜拳游戏
		''' @author: 人人都爱小雀斑 @time: 2020/3/6 18:52 @desc: 实验结果心得: 1.难点主要在判断谁输谁赢 2.挺好的 ''' import random d={1 ... 
- 【Nim 游戏】 学习笔记
		前言 没脑子选手随便一道博弈论都不会 -- 正文 Nim 游戏引入 这里给出最简单的 \(Nim\) 游戏的题目描述: \(Nim\) 游戏 有两个顶尖聪明的人在玩游戏,游戏规则是这样的: 有\(n\ ... 
- cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现
		一.创建GameScene以及GameLayer 就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2). 二.添加一个开始栏 很简单,就是调用Block中的create ... 
- cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建
		一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何 ... 
- cocos2dx游戏开发——微信打飞机学习笔记(七)——Enemy的搭建
		一.文件创建~ Enemy.h Enemy.cpp 二.How to do? 由于我是已经完成成个游戏的功能,所以我会将游戏中enemy所需要的很多功能基本上都先考虑到了,如果大家自己在做的时候也许没 ... 
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
		源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ... 
- DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)
		本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ... 
- 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头
		摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ... 
随机推荐
- 命令行模式和python交互模式
			一.命令行模式 在Windows开始菜单选择“命令提示符”,就进入到命令行模式,它的提示符类似C:>:. 二.Python交互模式 在命令行模式下敲命令python,就看到类似如下的一堆文本输出 ... 
- effective c++ 笔记 (49-52)
			//---------------------------15/04/27---------------------------- //#49 了解new-handler的行为 { /* 1:在o ... 
- FastDFS教程Ⅰ-文件服务器安装与Nginx配置
			1.简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载 ... 
- grunt源码解析:整体运行机制&grunt-cli源码解析
			前端的童鞋对grunt应该不陌生,前面也陆陆续续的写了几篇grunt入门的文章.本篇文章会更进一步,对grunt的源码进行分析.文章大体内容内容如下: grunt整体设计概览 grunt-cli源码分 ... 
- Asp.Net_from标签中的Enctype=multipart/form-data作用
			ENCTYPE="multipart/form-data"用于表单里有图片上传. <form name="userInfo" method="p ... 
- Linux/centos 7 使用动态ip(dhcp)切换成静态ip后无法联网的问题
			确保:子网掩码,网关,dns一致,最后修改: /etc/sysconfig/network-scripts/ifcfg-ens33 查看网关和子网掩码: route -n 查看dns 
- kettle开源项目部署文档
			kettle开源项目部署文档 1.kettle简介 kettle是一款国外开源的ETL(Extract Transform Load)工具,纯java编写,可以在Windows.Linux.Unix上 ... 
- PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径
			模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ... 
- 第二个Sprint计划
			第一个Sprint计划已完成基本框架,接着第二个计划 时间:5月30-6月3日 目标:能够将各个框架连接起来,实现基本功能,并查看数据库连接. 分工:杜殷浩:查看数据库连接,创建数据库. 何广强:实现 ... 
- 我们的团队-IT梦想队
			IT梦想队 队长:李遇塘 队员:王长.周兴荣.朱岭杰.马婧婧 团队宣言: 一匹狼战斗力低,但一群狼的我们无所畏惧!李遇塘http://www.cnblogs.com/Liyutang/ 王 长htt ... 
