这个问题是我在监考时闲来无事,一位同事突然跟我说了这么一个游戏,我起初以为是简单的为佐夫博弈,没想到一丁点的改动,竟然会是大相径庭!

题意:

现在进行以下游戏,规则如下

有3堆纸团,分别为3,5,7,规定两人轮流取纸团,每次最多只能从一堆中取1-n个,规定谁取到最后一个为输。

现在问假设我第一个取,有没有办法一定取胜

分析:

典型的为佐夫博弈,可是为佐夫博弈是取到最后一个为赢,因此结果会大相径庭。

1.寻找第一个必败局势 001

2.从这一点出发找到所有的必败局势

3.找到所有的必胜局势

4.找到必胜局势转化为必败局势的方法

以下解决这个问题的通解(可以是任意的a,b,c三个值)

import java.util.ArrayList;
import java.util.Arrays;
public class Main {static ArrayList<String>al = new ArrayList<String>();static int is(String s){char[]cs = s.toCharArray();char[]csa;for (int i = 0; i < cs.length; i++) {char tmp = cs[i];for (char j = cs[i]; j>='0'; j--) {cs[i]=j;csa=Arrays.copyOf(cs, cs.length);Arrays.sort(csa);String tsString = String.valueOf(csa);if(tsString.equals("000"))return 4;int in=al.indexOf(tsString);if(in!=-1)return in;}cs[i]=tmp;}return -1;}public static void main(String[] args) {al.add("001");for (int i = 0; i <= 3; i++) {for (int j = 0; j <=5; j++) {for (int j2 = 0; j2 <=7; j2++) {if(is(i+""+j+""+j2)<0){String string = i+""+j+""+j2;char [] cs = string.toCharArray();Arrays.sort(cs);al.add(String.valueOf(cs));}}}}System.out.println("必败局势!");for (int i = 0; i < al.size(); i++) {System.out.println(al.get(i));}System.out.println("必胜局势!");for (int i = 0; i <= 3; i++) {for (int j = i; j <=5; j++) {for (int k = j; k <=7; k++) {String string = i+""+j+""+k;char [] cs = string.toCharArray();Arrays.sort(cs);int in=al.indexOf(String.valueOf(cs));if(String.valueOf(cs).equals("000"))continue;if(in<0){int ia = is(String.valueOf(cs)); System.out.println("必胜:"+String.valueOf(cs)+" -> 必败:"+al.get(ia));}}}}}}

运行结果:

必败局势!
001
022
033
044
055
111
123
145
246
257
347
356
必胜局势!
必胜:002 -> 必败:001
必胜:003 -> 必败:001
必胜:004 -> 必败:001
必胜:005 -> 必败:001
必胜:006 -> 必败:001
必胜:007 -> 必败:001
必胜:011 -> 必败:001
必胜:012 -> 必败:001
必胜:013 -> 必败:001
必胜:014 -> 必败:001
必胜:015 -> 必败:001
必胜:016 -> 必败:001
必胜:017 -> 必败:001
必胜:023 -> 必败:022
必胜:024 -> 必败:022
必胜:025 -> 必败:022
必胜:026 -> 必败:022
必胜:027 -> 必败:022
必胜:034 -> 必败:033
必胜:035 -> 必败:033
必胜:036 -> 必败:033
必胜:037 -> 必败:033
必胜:045 -> 必败:044
必胜:046 -> 必败:044
必胜:047 -> 必败:044
必胜:056 -> 必败:055
必胜:057 -> 必败:055
必胜:112 -> 必败:111
必胜:113 -> 必败:111
必胜:114 -> 必败:111
必胜:115 -> 必败:111
必胜:116 -> 必败:111
必胜:117 -> 必败:111
必胜:122 -> 必败:022
必胜:124 -> 必败:123
必胜:125 -> 必败:123
必胜:126 -> 必败:123
必胜:127 -> 必败:123
必胜:133 -> 必败:033
必胜:134 -> 必败:123
必胜:135 -> 必败:123
必胜:136 -> 必败:123
必胜:137 -> 必败:123
必胜:144 -> 必败:044
必胜:146 -> 必败:145
必胜:147 -> 必败:145
必胜:155 -> 必败:055
必胜:156 -> 必败:145
必胜:157 -> 必败:145
必胜:222 -> 必败:022
必胜:223 -> 必败:123
必胜:224 -> 必败:022
必胜:225 -> 必败:022
必胜:226 -> 必败:022
必胜:227 -> 必败:022
必胜:233 -> 必败:033
必胜:234 -> 必败:123
必胜:235 -> 必败:123
必胜:236 -> 必败:123
必胜:237 -> 必败:123
必胜:244 -> 必败:044
必胜:245 -> 必败:145
必胜:247 -> 必败:246
必胜:255 -> 必败:055
必胜:256 -> 必败:246
必胜:333 -> 必败:033
必胜:334 -> 必败:033
必胜:335 -> 必败:033
必胜:336 -> 必败:033
必胜:337 -> 必败:033
必胜:344 -> 必败:044
必胜:345 -> 必败:145
必胜:346 -> 必败:246
必胜:355 -> 必败:055
必胜:357 -> 必败:257

由此看出:
3,5,7是必胜局势,即先取者肯定有办法取胜

从3,5,7游戏看为佐夫博弈相关推荐

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

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

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

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

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

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

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

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

  5. 51NOD 1185 威佐夫游戏 V2(威佐夫博弈)

    1185 威佐夫游戏 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取 ...

  6. HDU1527 - 取石子游戏【威佐夫博弈】

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

  7. 取石子游戏(威佐夫博弈)

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

  8. 威佐夫游戏 51Nod - 1072 (威佐夫博弈)

    有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取.拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出2堆石子的数量, ...

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

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

最新文章

  1. Xcode:Task failed with exit 1 signal 0 {
  2. CodeForces - 1313C2 Skyscrapers (hard version)(单调栈+dp/分治)
  3. Bootstrap table 行编辑导航
  4. 正则匹配中文 UTF-8 GBK
  5. SQL(二)- 基础查询语句
  6. Tomcat启动过程源码解读
  7. nagios监控windows主机 linux主机
  8. c语言从源代码到可执行,从源代码到可执行文件
  9. 手把手自己造无人驾驶车,是什么样的体验?
  10. 春运抢票靠加速包?试试这个 Python 开源项目吧
  11. html保存按钮代码_如何防止Joomla编辑器删除HTML代码
  12. linux内核代码container_of
  13. 这样一群人 致踏上CCIE之路的兄弟们!
  14. 我的第一个WM5程序
  15. 根据浏览器获取经纬度
  16. 国内外银行核心系统之间的差异
  17. wpf 如何让当前窗口隐藏
  18. @Deprecated注解
  19. 解析几何 曲线与二次曲面 曲面方程与坐标变换(2.1,2.2)
  20. 行车安全的基础是技术和经验

热门文章

  1. win10系统安装Linux虚拟机一条龙安排
  2. 奇葩面试题,O(logn)的底数是多少?
  3. lenovo thinkpad t460s tlp-stat 修复acpi_call
  4. 用计算机制作微课教学教案,用计算机写文章微课教案
  5. flex弹性布局详解
  6. 过了这么多年,我终于学会跟Office说再见
  7. 根据公司的整体发展战略,负责公司产品、技术方向研究、规划,完成公司制定的目标
  8. 模型训练评估——交叉验证法的介绍
  9. jq修改class_jquery 如何动态添加、删除class样式方法介绍
  10. 猿人学js混淆-源码乱码解法总结