威佐夫博弈—黄金分割比

经典例题:

有两堆石子,有两个绝顶聪明的人在玩一个游戏,每次每个人可以从一堆石子中取任意数量但不少于1个的石子,或从两堆中同时取走相同数量的石子,最后一个取完石子的人获胜。

面对博弈题,最重要的找出必败点

(0,0)(1,2)(3,5)(4,7)(6,10)……

通过观察可以发现奇异局势的特点:

  • An是前面n-1对必败点中没有出现过的最小正整数,Bn = An + n

  • 任何一个自然数都包含在一个且仅有的一个局势中。

  • 任何的操作都可以将奇异局势变成非奇异局势。

  • 通过适当的方法可以将非奇异局势变成奇异局势

对于特点1:

打表找规律即可.jpg

对于特点2:

**反证法:**假设这个自然数v出现了两次,那么v一定不是奇异局势的a(由特点1得:a只能出现一次),所以v是奇异局势的b,而两个局势的b相同,但两个局势中a与b的差值必不同,则这两个局势必然有一个不是奇异局势,说明v肯定不能出现两次啊

对于特点3:

对于一个奇异局势,若取走一堆中的石子,那么两对石子的差值必然改变,必然成为非奇异局势

对于一个奇异局势,若同时取走两堆石子,因为一个差值只能对应一种奇异局势,现在改变了a,b而差值不变,则必不是奇异局势

对于特点4:

所谓适当的方法,可以分为如下几种:

  • 当a = b时,可以将两堆同时取光,剩下(0,0),为奇异局势
  • 当a = a[k],b > b[k]时,只需取走第二堆的b - b[k]个石子即可
  • **当a = a[k],b < b[k]时,两堆需要同时取走a - k(b - a)个石子,k属于正整数。**当两堆同时取完后,就剩下(k(b - a), k(b - a) + (b - a))的奇异局势!!!
  • 当a > a[k],b = b[k],只需第一堆取走a - a[k]个石子即可
  • 当a < a[k], b = b[k],须分两种情况:1.a[k] == aj,即a[k]等于在他之前的任意一个奇异局势的a的值,此时,只需从第二堆取走b - bj个石子即可构成(aj,bj)的奇异局势;2.a[k] == bj,即a[k]等于在他之前的任意一个奇异局势的b的值,此时只需从第二堆取出b - aj个石子即可构成(bj, aj)的奇异局势。

而对于奇异局势(a,b)的判断条件:

ak = k * (sqrt(5) + 1) / 2; bk = ak + k;

具体证明利用的是Betty定理,经过一系列证明啊带入啊得到的,在这里我不太会说明白就不证明了,有兴趣的同学可以去传送门看看。

现在举个vj的例题:K - 取石子游戏

我们只需要判断a b的差值乘以1.618然后取整后是否等于a即可!若等于则先手必输,否则先手必胜!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b;
int main()
{while(cin>>a>>b){if(a > b)swap(a, b);//将小的数放在前面if((int)((b - a) * (sqrt(5.0) + 1.0) / 2.0) == a)cout<<0<<endl;elsecout<<1<<endl;}return 0;
}

巴什博弈 — Bash Game

经典例题:

两个顶尖聪明的人在玩游戏,有n个石子,每人可以随便拿1-m个石子,不能拿的人为败者,问谁会胜利

我们分情况讨论一下下:

  • 当n <= m时,先手必胜
  • 当n == m + 1时,后手必胜
  • 当n == k *(m + 1)时,先手取i个,后手都可以将剩下的m + 1 - i个取走,维持下去,所以后手必胜
  • 当n == k *(m + 1) + x时,先手可以先取走那x个,局势就变成上面的那样,所以先手必胜

结论:

if(n % (m + 1) == 0)先手必败
else先手必胜

变式:

1、 总共n张牌;
2、 双方轮流抓牌;
3、 每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)
4、 抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;
假设Kiki和Cici都是足够聪明(其实不用假设,哪有不聪明的学生~),并且每次都是Kiki先抓牌,请问谁能赢呢?

思路:

打表找规律能发现:如果是3的倍数,则先手必胜,否则必败

#include<bits/stdc++.h>
using namespace std;
int main()
{int n;cin>>n;if(n % 3)cout<<"Kiki\n";elsecout<<"Cici\n";return 0;
}

尼姆博弈

先从最简单的模型说起:有三堆若干个物品,每次至少拿一个,多者不限,最后取光者胜。

要想制造必胜局,我们得让对面陷入一种必败态,然后维护这种必败态即可,所以我们可以想一下必败态是什么样的,最特殊的必败态是(0,0,0),这样的情况下是对方已经取完最后的物品,获胜了。再仔细分析一下(0,n,n)也是一种必败态,为什么呢 ?因为无论我选择取哪一堆的多少物品,对方只需要在另一堆上取相同数目的物品,保持(0,n,n)的局势,取到最后一定会变成(0,1,1)的局势,这样我只能取一个物品,剩下的那个物品对方就可以取了获胜。再仔细想想,(1,2,3)其实也是一种必败态,因为无论我如何取,取多少,对方都可以将局势变成(0,n,n)的必败态。

我们将这种局势统称为奇异局势,那这种奇异局势有什么特点呢?

也不知道是谁这么牛逼,竟然能把这种局势和二进制连续在一起

对于奇异局势来说,a ^ b ^ c其实是等于0的。第一种必败态就不用说了全是0,异或完了也是0,对于第二种,n^n其实也是0,因为任何数异或她本身得到的绝对是0,对于第三种(a,b,c)类的异或和也是0

如果我们面对的是一个非必败态(a,b,c),要如何变成必败态呢?

我们假设a < b <c,我们只需要将c变成a ^ b即可,因为这样的话c ^ (a ^ b)就是0了,符合必败态的规律,所以对于三堆物品,我们第一步只需要取c - (a ^ b)个物品即可

不知道,你看懂没……如果还是没懂,就给个面子装懂好嘛……

现在将尼姆博弈模型推广一下,有n个物品堆,两人人轮流在任意的物品堆取任意多的物品,最后取光者获胜

同样的(a,b,c,……n)堆物品,我们需要先求出abc……n的异或值,然后对每一堆进行判断,看需要取几个能构成必败态,也就是判断一下是否满足如下条件即可

if(tr[i] > (sum ^ tr[i]))

sum^tr[i]得到的是除了第i堆以外其他堆的数的异或和,如果我们能让第i堆的值等于剩下的所有值的异或和,那么他们异或起来的值肯定是0,即符合奇异局势

例题:E - Being a Good Boy in Spring Festival

思路:

先计算出所有数的异或值ans,然后循环跑一遍看看数里面有没有x能大于等于ans ^ x的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, tr[10005], sum, ans;
int main()
{while(cin>>n && n){ans = 0;sum = 0;for(int i = 1; i <= n; i++){cin>>tr[i];ans ^= tr[i];}for(int i = 1; i <= n; i++){if(tr[i] > (ans ^ tr[i]))sum++;}cout<<sum<<endl;}return 0;
}

尼姆博弈变形一

问题:

现在有n堆石子,每人每次可以从中选任意一堆,取1<= x <= k颗石子,最后取光者胜

思路:

相比于普通的尼姆博弈,主要的区别是取的数量发生了改变,无法取任意数量的石子了,所以我们可以让他取“任意”数量的石子,就先对每一堆石子进行巴什博弈,也就是对每堆石子变成x % (k + 1)个,此时相对来说就可以取任意石子,就再来一次尼姆博弈即可

尼姆博弈变形二

问题:

现有n堆石子,每人每次可以从中选至多k堆,每堆中可以取任意颗石子,取光者胜

思路:

将每堆石子的个数以二进制的形式表示,用数组tr[i]统计每一位上1的个数,如果每一位1的个数都可以被(K + 1)整除,则先手必败,否则先手必胜。

反尼姆博弈

题目:

现有n堆石子,每人每次可以从中选任意一堆取任意数量石子,至少一颗,取光者输掉

思路:

先手必胜条件:

  • 每堆石子的数目均为1,且石子数异或和为0

  • 至死一堆石子的数量不为1,且石子数异或和不为0

阶梯尼姆游戏

问题:

在一个阶梯上,每层有若干个石子,每次可以将其中某层中若干个石子移动到他下一层阶梯中去,不能操作者失败

思路:

对奇数堆进行尼姆博弈,如果异或和为0,则先手必胜

为什么可以这样呢?

假设我们先手,且奇数阶梯的石子数异或和为0,也就是我们必胜,我们只需要按能赢的步骤将奇数堆堆石子移动到偶数堆……如果对手也是移动奇数堆,我们也继续移动奇数堆……如果对手将偶数堆堆石子移动到奇数堆,我们就可以将对手移动到奇数堆的那些石子移动到下一个偶数堆,相当于奇数堆石子不变,总的来看就相当于没有偶数堆,只是奇数堆的数在一直消失,也就可以抽象成尼姆博弈!

那么为什么只对奇数堆进行尼姆博弈呢?偶数堆为什么不行?

因为奇数的时候我们可以将对手移动到奇数堆的石子移动到偶数堆,极端情况下是从1 -> 0,而如果堆偶数堆的时候,极端情况是将0 -> -1,很显然没有-1层阶梯,就无法成功,只能破坏原先的nim,导致胜负关系不确定。

参考博客:https://www.cnblogs.com/solvit/p/11393639.html

祝大家新年快乐鸭!(好像貌似可能差不多有那一内内的晚,就一内内⁄(⁄ ⁄ ⁄ω⁄ ⁄ ⁄)⁄,主要是年后这几天又开始看小说了,这小说不看完心里就总有个疙瘩,就一不小心看了炒鸡炒鸡长的时间,也就鸽了好处时间没写博客,今天就重拾这个博弈,将他补全了,先应付一波(= ̄ ρ ̄=) …zzZZ)

博弈论入门(论和威佐夫、巴什、尼姆打牌被吊打是什么感受(╥﹏╥)相关推荐

  1. 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)

    博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase) 转载自: http://tieba.baidu.com/p/1474319443 http://blog.sin ...

  2. 博弈论(巴什博弈,威佐夫博弈,尼姆博弈)

    文章目录 一.巴什博弈 二.威佐夫博弈 三.尼姆博弈 一.巴什博弈 一堆n个物品,两个人从中轮流取出1~m个,最后取关者胜. 同余定理:n=K*(m+1)+r;先取者拿走r个,那么后者无论拿走(1~m ...

  3. 博弈论(巴什博奕,威佐夫博弈,尼姆博弈)

    巴什博奕(Bash Game): 只有一堆n个物品,两个人轮流从中取物,规定每次最少取一个,最多取m个,最后取光者为胜 举一个最简单的例子就是,当n=m+1时,此时不管先手取多少,后手都能把剩下的取完 ...

  4. 博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)

    一.  巴什博奕(Bash Game): A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30.这应该是最古老的关于巴什博奕的游戏了吧. 其实如果知道原理,这游戏一点运气成分都没有,只和先手 ...

  5. 三大数学博弈:巴什博奕 威佐夫博奕 尼姆博奕

    有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个 人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏 ,别看这游戏极其简单,却蕴含着深刻的数学原理 ...

  6. 博弈的三个巨人 巴什博奕 威佐夫博奕 尼姆博奕

    转载一篇有关博弈写得不错的文章,同时也对文章中的错误部分修正. 博客正容:[一](先来苦涩的理论) (一)巴什博奕(Bash Game):只有一堆n 个物品,两个人轮流从这堆物品中取物, 规定每次至少 ...

  7. 基础博弈论(NIm,威佐夫,巴什游戏)

    最近刚刚接触了基础博弈论 一开始感觉是一个非常难以理解的专题 看了几天别人的题解 写了几道题感觉稍微有了一点点的感觉 下面来总结一下几个常见的基础博弈 1.巴什游戏 最简单的那当然就是巴什游戏了题目是 ...

  8. 巴什博弈、威佐夫博弈、妮姆博奕、斐波那契博弈

    巴什博弈 一堆   n个物品    两人轮流从中取物品    每人至少拿一个  最多拿m个    将这堆物品最后取完的是winner 先手胜利条件-------------   n%(m+1)!=0 ...

  9. 三种经典博弈(巴什博弈,威佐夫博奕,尼姆博奕)

    前言: 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等 均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间 很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的 ...

最新文章

  1. 软件详细设计说明书_互联网知识大全:软件开发中和各种开发软件文档的常见的英文缩写,还不快快收藏!...
  2. 如何对phpcms v9的首页列表进行分页?
  3. 攻防世界-web-fakebook-从0到1的解题历程writeup
  4. GCDWebUploader支持iOS进入后台后仍然可以进行传输
  5. Autofac之自动装配
  6. 透析阿里云视频云「低代码音视频工厂」之能量引擎——vPaaS视频原生应用开发平台
  7. 不靠谱的副业,别碰!
  8. 三星Galaxy Note20新旗舰发布会官宣:8月5日线上见
  9. VScode 知识点查阅
  10. 第二百一十六节,jQuery EasyUI,Spinner(微调)组件
  11. QGIS根据字段属性实现sld样式的编辑和导出
  12. 重磅!中国首家互联网银行联手腾讯、华为各大APP,最高5万额度,疯狂提额100亿!!!...
  13. 6、T5L DGUS ll 应用开发指南摘录(一)
  14. 分类---逻辑回归(二分类)
  15. DIYGW-UI-PHP是一款基于thinkphp framework和 element admin开发而成的前后端分离系统
  16. ⚡️狂神Linux学习笔记
  17. 2020美国大学计算机博士专业排名,美国大学计算机系统专业排名2020年
  18. mysql主从复制(一):一主多从
  19. 第五章 生活无处不数据,大数据真的能算命?
  20. 微信小程序 图片设置为圆形

热门文章

  1. 2022高处安装、维护、拆除操作证考试题库及在线模拟考试
  2. 网卡驱动程序框架和编写
  3. 大学物理:CH2-电磁学
  4. ThinkServer RD640 上安装redhat企业版6.5
  5. (原创).net menu click instead of hover 点击显示下一级
  6. c语言贪心算法零钱问题,贪心算法(2)——找零钱问题
  7. Springboot注入RestTemplate异常Field restTemplate in xxx.ApiRestUtils required a bea
  8. Deepin 系统使用记录:1. 修改启动项
  9. python二维码生成识别代码_Python3+qrcode+zxing生成和识别二维码教程
  10. 远程答题系统有哪些?远程答题系统如何使用