题目描述

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

对于一开始自己的想法是采用递归,后面发现不符合,然后自己慢慢去找必输的组合数

第一个(0,0),肯定是先手输,为啥?因为当先手兴冲冲地上来准备拿第一手时,发现已经是(0,0)了,他没石子可拿了,那最后的石子去哪了?肯定在上一局被它对手取光了,所以先手只能认输,而对手稳赢,因为规则就是第一个把石头取光的赢得胜利。

第二个(1,2),也是先手必输,为啥?因为先手上来取第一手时他只有四种取法:

1):在1中取1个,那么后手就把2中剩余的2个全部取光:先手输,后手赢

2):在2中取1个,那么后手在两堆中各取1个,石头又光了,先手又输了

3):在2中取两个,后手取1中剩下的一个,石头又光了,先手又输了

4):两堆中各取1个,后手取走2中剩余的1个,石头又光了,先手又输了

综上所述,对于(1,2)这种情况,无论先手怎么取,都是死路一条,必输!

第三个(3,5),先手还是死路一条,无论先手怎么取,最后兜兜转转都回到情形(1,2),上面已经分析过了,(1,2)先手必死无疑,可怜的先手啊!

第四个 ( 6 ,10  )

第五个 ( 8 ,13)

第六个 ( 9 , 15)

第七个 ( 11 ,18)……这些情况先手毫无招架能力,只能认输,那么这些数字到底有什么规律?规律有两个:
    一是从(0,0)开始到(11,18),两个数之间的差值是递增的分别是0,1,2,3,4,5,6,7……

二是每一局中的第一个值是前面所有的局中没有出现的数字,比如第三个局面,前面出现了 0  1 2,那么第三个局面的第一个值为 3 ,比如第五个局面,前

面出现了 0  1  2 3 4 5 ,那么第五个局面第一个值为6。

对于博弈论自己也不是很了解,就在百度上查找了威佐夫博弈

其实最后的总结就是:两堆石子的差值的1.618倍是否等于较小的那一个

第一个值 = 差值*1.618,这个才是解决此题的关键,而1.618 = (sqrt(5)+ 1) /  2 ,所以当我们拿着任意一组的两个值,只要判断一下是否符合“ 第一个值 = 差值*1.618”即可,如果是,那就是先手必输,不是,先手必赢!

#include<stdio.h>int main() {int a = 0, b = 0;while (~scanf("%d %d", &a, &b)) {//先把二者之中的较小值放在左侧if (a > b) {int temp = a;a = b;b = temp;}if (a == b) {//包括0 0这种特殊情况printf("1\n");//先手必胜} else if (a == (int)((b-a)*((sqrt(5)+1)/2))){printf("0\n");//先手必输} else {printf("1\n");//先手必赢}}return 0;
}

取石子问题--威佐夫博弈(Wythoff‘s game)相关推荐

  1. HDU - 1527 取石子游戏(威佐夫博弈)

    题目链接:点击查看 题目大意:有两堆石子,两个人轮流取,每次可以取一堆中任意多的石子,或者取两堆中数量相同的石子,先将石子取完者获胜,若先手获胜输出1,后手获胜输出0 题目分析:这个题目涉及到了威佐夫 ...

  2. 洛谷P2252 取石子游戏(威佐夫博弈)

    题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  3. 取两堆石子(威佐夫博弈)

    有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法, 一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者 ...

  4. 博弈基础与例题分析(巴什博弈威佐夫博弈尼姆博奕 斐波那契博弈SG博弈)

    文章目录 巴什博弈Bash Game 威佐夫博弈Wythoff Game 尼姆博奕 斐波那契博弈:算法如其名 SG博弈 图 mex(minimal excludant)运算 获得sg表 应用 A Br ...

  5. 威佐夫博弈:百练OJ:1067:取石子游戏

    威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...

  6. POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K              Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...

  7. 杭电acm 2177 取(2堆)石子游戏(威佐夫博弈)

    取(2堆)石子游戏                       Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  8. 【HDU - 1527】【POJ - 1067】取石子游戏 (威佐夫博弈)

    题干: 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者 ...

  9. POJ1067_取石子游戏_威佐夫博弈

    /* *State: 1067 Accepted 176K 16MS C++ 435B *题目大意: * 威佐夫博弈 *解题思路: * 略. */ #include <iostream> ...

  10. 巴什博奕(Bash Game)与威佐夫博弈(Wythoff game)

    绪论 博弈论又被称为对策论,既是现代数学的一个新分支,也是运筹学的一个重要学科. 博弈论主要研究公式化了的激励结构间的相互作用,是研究具有斗争或竞争性质现象的数学理论和方法.博弈论考虑游戏中的个体的预 ...

最新文章

  1. Ubuntu16.04如何彻底删除Apache2
  2. 记录sqlserver中使用变量
  3. Flask入门到放弃(四)—— 数据库
  4. 8086条件转移指令JE,JZ
  5. Tableau2019版本安装步骤
  6. 自动驾驶 | 清华车辆与运载学院最新科研成果公布!
  7. mybatis逆向工程生成的xxxExample实例详解
  8. 2019-06-02 Java学习日记之多线程上
  9. JavaScript:indexOf()方法
  10. Linux之常用操作命令总结一
  11. 用matlab如何画六边形,matlab怎样直接画出六边形
  12. MAC地址厂商查询网址
  13. 【转】linux下tcp测试工具
  14. IDEA使用的插件记录
  15. python属于什么类型的选修课_河北大学python选修课00次作业
  16. 阿里巴巴校招内推一面总结
  17. 3D MAX 插件的基本知识和安装方法
  18. 《爱的五种能力》读后感
  19. spring cloud 复杂类型 FeignClient 避免linkedHashMap
  20. 店铺差评有什么影响原因有哪些方面,怎么避免差评,被差评了怎么解决

热门文章

  1. 【数学】微分(Differential)的定义,微分与导数的区别
  2. 面试必备之Mysql索引底层原理分析
  3. The Minimum Spanning Tree Problem
  4. 大数据存储引擎-bigstore
  5. Java 9:“拼图计划终于给了我们急需的Java安全带”
  6. macbookpro 2021 各种软件设置中找不到麦克风权限问题
  7. 伽卡他卡学生端找不到计算机,伽卡他卡学生端
  8. 装了伽卡他卡打不开任务管理器的解决办法
  9. 更新来袭!新增语音添加待办、邮箱通知等功能
  10. 边城性格悲剧_悲剧! 我的手表已延迟!