巴什博奕

经典题目:n 个石子,每个人每次取 [ 1 , m ] 个,不能拿的人输

思路一:

  • 1> 当n<=m时,先手Win
  • 2> 当n=m+1时,后手Win
  • 3> 当n=k(m+1)时,后手Win
  • 4> 当n=k(m+1)+x (0<x<m+1)时,先手Win

思路二:
/**

  • 临界情况:当石子剩下(m+1)~(m+1)* 2 时胜负已定,接下来取的人输
  • 即:到达(m+1)* 2 ~ (m+1) * 3时胜负已定
  • 以此类推,就是(m+1)* k 时胜负已定,接下来取的人输,即取到这种情况的人赢
  • 如果石子数量为(m+1)* k ,则先手即为接下来取的人,即先手输
  • 反之,则后者输
  • */

结论:当石子的数量为(m+1)* k 时,先手输

public class 巴什博奕 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();  //石子个数int m = sc.nextInt(); //最多取的个数System.out.println("后手"+f (n , m));sc.close();}private static boolean f(int n , int m) {if(n % (m+1) == 0) {return true;  //后手Win}return false;  //先手Win}
}

例题1:


/*** 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此。* 当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考前的放松,所谓“张弛有道”就是这个意思。* 这不,Kiki和Cici在每天晚上休息之前都要玩一会儿扑克牌以放松神经。* “升级”?“双扣”?“红五”?还是“斗地主”?* 当然都不是!那多俗啊~* 作为计算机学院的学生,Kiki和Cici打牌的时候可没忘记专业,她们打牌的规则是这样的:* 1、  总共n张牌;* 2、  双方轮流抓牌;* 3、  每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)* 4、  抓完牌,胜负结果也出来了:最后抓完牌的人为胜者* * 假设Kiki和Cici都是足够聪明(其实不用假设,哪有不聪明的学生~),并且每次都是Kiki先抓牌,请问谁能赢呢?* 输入数据包含多个测试用例,每个测试用例占一行,包含一个整数n(1<=n<=1000)。* 如果Kiki能赢的话,请输出“Kiki”,否则请输出“Cici”,每个实例的输出占一行。
*/
/**
*我的个人思路:与思路二道理雷同
/*** 胜利规则:最后拿完的人胜利* 拿牌数目固定(即:1,2,4,8,16…)* 最后剩下3张牌时为临界情况,此时胜负已定,接下来拿牌的人输* 拿牌时能拿到1 , 2张牌,只有这两个数值连续,可以利用这个关系,对手拿2,我拿1,对手拿1,我拿2的关系* 使得当剩下3张牌+1+2张牌时,胜局已定,即剩下6张牌时,接下来拿牌的人输* (当剩下6张牌时,对手拿4相当于一次性拿了两个2,我只需要一次性拿两个1,往后同理)* 以此类推:当牌数为3k时,先手即为接下来拿牌的人,即先手输* 若为3k+x(x>0 && x<3)时,后手为接下来拿牌的人,即后手输*/class 英语四级考试 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int t = sc.nextInt();for(int i=0; i<t ; i++) {int n = sc.nextInt();f (n);}sc.close();}
private static void f(int n) {if(n % 3 == 0) {System.out.println("CiCi");//先手输}else {System.out.println("KiKi");//后手输}}
}

例题二:

/*** 虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金。* 现在等待他的,就是像FarmJohn一样的农田生涯。* 要种田得有田才行,Lele听说街上正在举行一场别开生面的拍卖会,拍卖的物品正好就是一块20亩的田地。* 于是,Lele带上他的全部积蓄,冲往拍卖会。* 后来发现,整个拍卖会只有Lele和他的死对头Yueyue。 * 通过打听,Lele知道这场拍卖的规则是这样的:刚开始底价为0,两个人轮流开始加价,* 不过每次加价的幅度要在1~N之间,当价格大于或等于田地的成本价 M 时,主办方就把这块田地卖给这次叫价的人。* Lele和Yueyue虽然考试不行,但是对拍卖却十分精通,而且他们两个人都十分想得到这块田地。* 所以他们每次都是选对自己最有利的方式进行加价* 由于Lele字典序比Yueyue靠前,所以每次都是由Lele先开始加价,请问,第一次加价的时候,* Lele要出多少才能保证自己买得到这块地呢?* 本题目包含多组测试,请处理到文件结束(EOF)。每组测试占一行。* 每组测试包含两个整数M和N(含义见题目描述,0<N,M<1100)* 对于每组数据,在一行里按递增的顺序输出Lele第一次可以加的价。两个数据之间用空格隔开。* 如果Lele在第一次无论如何出价都无法买到这块土地,就输出"none"。*初始价格为0,两人轮流加价,每次加价在1~N之间,田地价格为M*当价格大于等于M时,胜利*Lele先报价,若无法买到则输出“none”,否则递增输出Lele的(第一次)报价*/class 土地拍卖 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt();//土地价格int n = sc.nextInt();//报价范围最大值[1 , N]f (m , n);sc.close();}
private static void f(int m, int n) {if(m % (n+1) == 0) {System.out.println("none"); //先手输return;}if( m <= n ) {for(int i=m ; i<=n ; i++) {System.out.println(i);}return;}//倒数一次报价等于n+1的倍数即可for(int i = 1 ; i * (n+1) <= m ; i++) {int x = i * (n+1);if(n >= (m-x) && 1 <= (m-x)) {System.out.println(m-x);}}}
}

尼姆博弈:

/**

  • 经典问题:
  • 有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,
  • 规定每次至少取一个,多者不限,最后取光者得胜。
  • */

可参照:https://blog.csdn.net/l_z_w99/article/details/58114068

/**

  • 一组数异或等于0,说明两数相同或多个数异或等于另一个数
  • a ^ 0 = a a ^ a = 0
  • 若a1a2a3…^an==0,定义为利他态,用T表示
  • 否则为利己态,用S表示
  • 对于任意一个S态,总能从一堆中取出若干个使之成为T态
  • (将一个大堆变小堆的过程)
  • S态,取任何一堆的若干个,总能变成T态
  • S态异或值大于0,令异或值等于C,C的最高位的位数为P,值为1,则必然存在
  • a(i)与C的第P位也是1,否则会发生冲突
  • T态,取任何一堆的若干个,都将变成S态
  • S态只要方法正确,必赢
  • 最终的胜利即由S态转T态 0 0 0(最终获胜的状态)
  • /

代码实现:

public class 尼姆博奕 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] arr = new int[n];for(int i=0; i<n ;i++) {arr[i] = sc.nextInt();}System.out.println("先手:"+f (arr));sc.close();}private static boolean f(int[] arr) {int num = 0;for(int i=0 ; i<arr.length ; i++) {num ^= arr[i];}if(num == 0) return false;//初始状态为T态else return true;     //初始状态为S态 0 0 0}
}

博弈论: https://www.cnblogs.com/Khada-Jhin/p/9609561.html

对巴什博奕和尼姆博弈的理解相关推荐

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

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

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

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

  3. 巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈模板

    1.巴什博奕 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够 ...

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

    [前言] 今天才算是搞明白了(??)最基本的四种博弈 [小结] 1.巴什博奕(Bash Game) 一堆中取石子,两个人轮流取石子,每次取石子量至少为1,至多为m,先取完者胜利. 当n%(m+1)== ...

  5. 【小组专题二:博弈论入门综述(1)】NP状态 | SG函数 | 巴什博奕、威佐夫博弈、斐波那契博弈、Nim游戏、SJ定理

    博弈论综述[1] 前言 博弈与博弈论 博弈树 NP状态 SG函数(Sprague-Grundy) Sprague-Grundy Theorem 巴什博奕 Bash Game 威佐夫博弈 扩展威佐夫博弈 ...

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

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

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

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

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

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

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

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

  10. NYOJ135 取石子(二)尼姆博弈+巴什博奕

    题目链接:NYOJ135 尼姆博弈和巴什博奕的结合 题目思路:每一堆的必胜状态是 m%(n+1) 然后对每一堆的最优解进行异或,如果是非平衡状态则先手必胜,否则先手必败. /* 2017年8月23日2 ...

最新文章

  1. Java:由浅入深揭开 AOP 实现原理
  2. 北大OJ百练——3179:最长单词(C语言)
  3. python中如何将字符串连接在一起,多倍的字符串如何输出
  4. 初识大数据(三. Hadoop与MPP数据仓库)
  5. 通信 / 各种协议默认端口汇总
  6. 如何将Emacs添加到右键菜单并显示为“烤肉”
  7. 老陈学 C++ 序列之二: 友元函数
  8. PHP标题获取数据库内容,php – 如何从数据库获取项目的标题并将其发送到CodeIgniter中的标题模板...
  9. 双目立体视觉匹配算法-----SAD匹配算法、BM算法、SGBM算法、GC算法
  10. flask_loginer
  11. 吉大c 语言程序设计奥鹏作业,吉大18秋学期《C语言程序设计》在线作业一答案...
  12. java中的内部类_Java中成员内部类的使用
  13. c语言如何删除链表相同元素,【图片】想问一道链表题,如何删除重复元素【c语言吧】_百度贴吧...
  14. BAT文件中如何注释:
  15. python万年历差农历程序_批处理万年历实现代码(包括农历日期)
  16. 修修补补,不如推倒重建
  17. Oracle账号 Oracle官网登录下载资源账号密码共享
  18. 用计算机撩人套路,撩人套路-撩人套路情话一问一答 - 个性说说吧
  19. LOJ#6089 小 Y 的背包计数问题 - DP精题
  20. 啥子?软件测试-白盒测试

热门文章

  1. 电力电子技术(17)——交流电力控制电路和交交变频电路
  2. (实验)完成一个医院挂号系统
  3. CMD命令Program Files问题
  4. linux挂载镜像iso文件作为yum源
  5. IDEA2020版桌面图标变空白问题解决
  6. java计算机毕业设计民航售票管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  7. Stata:数据包络分析(DEA)
  8. wifi无法获取ip地址的解决方法
  9. linux tar.7z如何解压,(转)Linux下解压:tar、rar、7z命令
  10. 办公人员必须会的15种求和技巧