巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈模板
1.巴什博奕
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;int main()
{int N, num, limit;scanf("%d", &N);while(N--){scanf("%d%d", &num, &limit);if(num % (limit + 1) != 0) //必胜局面printf("Win\n");elseprintf("Lose\n");}return 0;
}
2.威佐夫博奕
这种博弈比前面一种要稍微复杂一点。我们来看下下面这个游戏。
有两堆火柴棍,每次可以从某一堆取至少1根火柴棍(无上限),或者从两堆取相同的火柴棍数。最后取完的是胜利者。
只要记住公式:a[i] = [i*(1+√5)/2](这里的中括号表示向下取整) b[i] = a[i]+i;
我们用a[i]表示失败态中的第一个,b[i]表示失败态中的第二个.(i从0开始).
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;int main()
{int num1, num2, tmp; //第一堆剩的数量为num1,第二堆剩num2while(scanf("%d%d", &num1, &num2) != EOF){if(num1 > num2)swap(num1, num2); tmp = floor((num2 - num1) * (1 + sqrt(5.0)) / 2.0); //黄金分割if(tmp == num1) printf("Lose\n"); //奇异局势必败else printf("Win\n");}return 0;
}
3.尼姆博奕
指的是这样的一个博弈游戏,目前有任意堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:
1)每一步应取走至少一枚石子;每一步只能从某一堆中取走部分或全部石子;
2)如果谁取到最后一枚石子就胜。
判断当前局势是否为必胜(必败)局势:
把所有堆的石子数目用二进制数表示出来,当全部这些数按位异或结果为0时当前局面为必败局面,否则为必胜局面;
#include<iostream>
using namespace std;
int temp[ 20 ]; //火柴的堆数int main()
{int i, n, min;while( cin >> n ){for( i = 0; i < n; i++ )cin >> temp[ i ]; //第i个火柴堆的数量min = temp[ 0 ];for( i = 1; i < n ; i++ )min = min^temp[ i ]; //按位异或if( min == 0 )cout << "Lose" << endl; //输elsecout << "Win" << endl; //赢}return 0;
}
4.斐波那契博弈
有一堆个数为n的石子,游戏双方轮流取石子,满足:
1)先手不能在第一次把所有的石子取完;
2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。
约定取走最后一个石子的人为赢家,求必败态。
这个游戏叫做斐波那契博弈,肯定和斐波那契数列:f[n]:1,2,3,5,8,13,21,34,55,89,… 有密切的关系。如果试验一番之后,可以猜测:先手胜当且仅当n不是斐波那契数。换句话说,必败态构成斐波那契数列。
至于本题的模板,我们来看一道模板题:点击打开链接
这里没有给出具体的证明,只是简单的模板,如果学习更多再补充
巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈模板相关推荐
- 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)
博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase) 转载自: http://tieba.baidu.com/p/1474319443 http://blog.sin ...
- 博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)
一. 巴什博奕(Bash Game): A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30.这应该是最古老的关于巴什博奕的游戏了吧. 其实如果知道原理,这游戏一点运气成分都没有,只和先手 ...
- 四种基础博弈 巴什博奕+威佐夫博奕+斐波那契博弈+K倍博弈
博弈论(Game Theory) 博弈论是指研究多个个体或团队之间在特定条件制约下的对局中利用相关方的策略,而实施对应策略的学科.有时也称为对策论,或者赛局理论,是研究具有斗争或竞争性质现象的理论和方 ...
- 数学基础(四)博弈论(巴什博弈~威佐夫博弈(黄金分割率)~尼姆博奕~斐波那契博弈~SG函数模板)
一.巴什博弈 1.问题模型 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜. 2.解决思路: 当n=m+1时,由于一次最多只能取m个,所以无论先取者拿走多 ...
- 博弈基础与例题分析(巴什博弈威佐夫博弈尼姆博奕 斐波那契博弈SG博弈)
文章目录 巴什博弈Bash Game 威佐夫博弈Wythoff Game 尼姆博奕 斐波那契博弈:算法如其名 SG博弈 图 mex(minimal excludant)运算 获得sg表 应用 A Br ...
- 【小组专题二:博弈论入门综述(1)】NP状态 | SG函数 | 巴什博奕、威佐夫博弈、斐波那契博弈、Nim游戏、SJ定理
博弈论综述[1] 前言 博弈与博弈论 博弈树 NP状态 SG函数(Sprague-Grundy) Sprague-Grundy Theorem 巴什博奕 Bash Game 威佐夫博弈 扩展威佐夫博弈 ...
- 基础博弈论(巴什博奕、斐波那契博弈、威佐夫博奕、尼姆博奕)
[前言] 今天才算是搞明白了(??)最基本的四种博弈 [小结] 1.巴什博奕(Bash Game) 一堆中取石子,两个人轮流取石子,每次取石子量至少为1,至多为m,先取完者胜利. 当n%(m+1)== ...
- 巴什博弈、威佐夫博弈、妮姆博奕、斐波那契博弈
巴什博弈 一堆 n个物品 两人轮流从中取物品 每人至少拿一个 最多拿m个 将这堆物品最后取完的是winner 先手胜利条件------------- n%(m+1)!=0 ...
- 关于博弈基础知识的总结:巴什博弈(Bash Game)、威佐夫博奕(Wythoff Game)、尼姆博奕(Nim Game)
转载自http://www.aiuxian.com/article/p-942548.html 博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论. 基础的基础 ...
最新文章
- 前端笔记(7)css属性书写顺序,布局流程,chrome调试工具
- 脚本征集大赛开启啦!100% 有奖!
- emacs命令速查 摘
- ppt设置外观样式_如何设置更符合需要的幻灯片背景?
- JavaScript中的endsWith
- Linux中which命令作用,【每天一个Linux命令】12. Linux中which命令的用法
- mysql语句将日期转换为时间戳的方法
- vhd安装windows 7 64位
- C语言rand(),srand()函数真实性能分析
- # 删除注册表项键值_强制删除:让你的电脑上不再有“顽固”程序
- Oracle 客户端连接服务器[转]
- 测试动态视力软件叫什么影响吗,动态视力
- Mac下matplotlib中文显示
- MySQL 添加列 修改列 删除列
- 使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)
- python两数之和是多少_Python面试:两数之和
- Access根据出生日期计算年龄_从身份证号码计算年龄
- 字节云数据库未来方向的探索与实践
- Unraid USB启动盘怎么更换和重新获取注册码密钥?
- vue router 嵌套、父子、多个路由跳转传值获取不到参数undefined