博弈论——威佐夫博弈
来源:互联网 发布:java 异步编程 编辑:程序博客网 时间:2024/06/18 18:19
威佐夫博弈(Wythoff Game):
有两堆各若干个石头,两个人轮流从某一堆或同时从两堆中取同样多的石头,规定每次至少取一个,多者不限,最后取光者得胜。
我们假设两堆石头的状态为
我们试想一下:如果A遇到两堆石头的状态为(0,0)是不是就代表着输了?我们称这种状态为奇异状态,也叫失败态。接下来的失败态为(1,2)、(3,5)、(4,7)、(6,10)、(8,13)……也就是说谁遇到这个状态谁就意味着失败。
为什么称这些状态为失败态呢??比如(1,2)这一状态,A如果遇到此状态,它有三种取法:
(1).取第一堆一个石子或第二堆两个石子,则状态变为(0,2)或(1,0),那么B直接取第二堆两个石子或第一堆一个石子,取完状态变为(0,0),则A输。
(2).取第二堆一个石子,则状态变为(1,1),那么B同时从两堆中取一个石子,取完状态变为(0,0),则A输。
(3).同时从两堆中取一个,则状态变为(0,1),那么B从第二堆取一个,取完状态变为(0,0),则A输。
所以A遇到(1,2),最后一定会转变为A遇到(0,0),同理其他奇异态都是如此。
我们用
所有综上所述,失败态有三个基本的结论:
每个数字只存在一个失败态中
每个失败态都能转变为非失败态
每个非失败态也能转变为失败态
因为每个数都一定出现在一个失败态中,所以一个状态
(1).当
如果
(2).当
如果
如何判断一个状态是否为失败态呢?知道这个我们就知道谁一定会输了,因为只要判断一个状态为失败态,先取的人一定会输。
用下面的公式进行判断:
代码如下:
#include<stdio.h>#include<cmath>#include<algorithm> using namespace std;int main(){ int a,b; int k; while(scanf("%d%d", &a, &b)!=EOF) { if(a > b) swap(a, b); k = floor((b-a)*(1+sqrt(5.0))/2.0); if(k == a) printf("Lose\n");//为奇异状态 else printf("Win\n"); } return 0;}
- 博弈论——威佐夫博弈
- 博弈论——人生就是在博弈
- 博弈论--巴什博弈——HDU1846
- 博弈论模型(威佐夫博弈)
- 博弈的构成要素——生活博弈论1
- 博弈论 (简单博弈分析)——Coin Game ( HDU 3951 )
- 博弈论 (Nim 博弈)—— HDU 1907 && HDU 2509
- 趣味博弈论——斐波那契博弈
- hdoj 2188 悼念512汶川大地震遇难同胞——选拔志愿者 【博弈论&&巴什博弈】
- 博弈论 ( 斐波那契博弈 )——取石子游戏 ( HDU 2516 )
- 博弈论专题——推理与动态规划相关博弈之POJ2484 POJ1740(模仿游戏)
- 博弈论专题——推理与动态规划相关博弈之POJ2348
- 博弈论专题——推理与动态规划相关博弈之POJ2068 POJ3688动态规划)
- 基础博弈论之——简单的博弈问题【hdu1525】【Euclid‘s Game】
- 【博弈论】阶梯博弈
- 博弈论之Nim 博弈
- 博弈论之阶梯博弈
- 博弈论-巴什博弈
- 电商架构项目全产品开发需要掌握的技术
- 数据库系统概念
- Android 上下滑动阻尼效果/下拉图片伸缩
- SpringBoot入门学习
- 7.存储模型
- 博弈论——威佐夫博弈
- 严嵩:是奸臣 也是家具收藏大咖
- Vue.js 2.0和Cordova开发webApp环境搭建
- vagrant Laravel 5 permission denied
- java开篇 环境变量的配置
- 鸡兔同笼
- 《tensorflow实战》学习2——实现多层感知机
- 关于 Mybatis的 $ 和 # , 你真的知道他们的细节吗 ?
- Spring MVC 的共组流程