Nim游戏变种——取纽扣谁先取完
(2017腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢。Cavin和David都非常想赢得这个游戏,如果Cavin可以先取,Cavin的必胜策略下第一步应该取
A、1个
B、3个
C、6个
D、Cavin没有必胜策略
解析:这道题是Nim游戏的变种,Nim游戏是博弈论中最经典的模型(之一)。
根据博弈论的性质:对于巴什博弈,存在必胜点和必败点,是指在当前这个点上的先手玩家是“必胜”(指的是采取必胜策略下的必胜)还是必败。对于一个点,如果它的下一步全是必胜点,那么显然无论它如何走都是让对手进入必胜点,所以当前这个点就是必败点;如果下一步中存在一个必败点,那么当前这一步的玩家就可以选择让对手进入这个必败点的走法,所以当前这个点就是是必胜点。
对这题来说,显然0的时候是必败点;看1,只能选择拿走1个,变成0,0是必败点,1可以到达必败点,所以1是必胜点;然后看2,2的下一步只能选择拿走1个变成1,1是必胜点,2只能到达必胜点,所以2是必败点;3的下一步2和0,都是必败点,3可以到达必败点,所以3是必胜点.......同理,当推到16的时候,下一步有三种走法,分别是15,13,10,由前面推理过程,15和10都是必胜点,只有13是必败点。因此先手应该选择拿走3个棋子,让对手进入必败点。
详细推理过程如下表(自上而下):
| 必败点 | 必胜点 |
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 |
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set; /**
* Created by dave on 2016/9/1.
* 假设有16个球,有david和cavin两个人轮流来取,每个人只能去1,3,6.先取完的为胜。由David先取,问David第一次去多少才能保证胜利
*/
public class Main {
static int[] steps = new int[]{1,3,6};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = scanner.nextInt();
int choose = doWork(count);
System.out.println(choose);
}
private static int doWork(int count){
Set<Integer> allowSet = new HashSet<>();
Set<Integer> failSet = new HashSet<>(); for(int tmp:steps)
allowSet.add(tmp); for(int i = 1;i<count;i++){
if(allowSet.contains(i))
continue;
if(checkIsAllowed(failSet,i))
allowSet.add(i);
else if(checkIsFailed(allowSet,i))
failSet.add(i);
} for(int tmp:steps){
if(failSet.contains(count-tmp))
return tmp;
}
return -1;
} private static boolean checkIsAllowed(Set<Integer> set,int val){
for(int tmp:steps){
tmp = val-tmp;
if(tmp > 0 && set.contains(tmp))//下一步是对面必败点,该点是必胜点
return true;
}
return false;
}
private static boolean checkIsFailed(Set<Integer> set,int val){
for(int tmp:steps){
tmp = val-tmp;
if(tmp > 0 && !set.contains(tmp))//下一步不在必胜点中
return false;
}
return true;//下一步在必胜点,该点必败
}
}
Nim游戏变种——取纽扣游戏
腾讯模拟题之取球问题
Nim游戏变种——取纽扣谁先取完的更多相关文章
- Nim游戏变种——取纽扣游戏
(2017腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢.Cavin和D ...
- ZOJ 3964 Yet Another Game of Stones Nim游戏变种
ZOJ3964 解题思路 此题的题意比较容易理解,可以简单的看着 Nim 博弈的变种.但问题在于 Alice 对第 i 堆石子的取法必须根据 bi 确定.所以如果这个问题能够归结到正常的 Nim 博弈 ...
- BZOJ 1874 取石子游戏 (NIM游戏)
题解:简单的NIM游戏,直接计算SG函数,至于找先手策略则按字典序异或掉,去除石子后再异或判断,若可行则直接输出. #include <cstdio> const int N=1005; ...
- Nim游戏
目前有3堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:1)每一步应取走至少一枚石子:每一步只能从某一堆中取走部分或全部石子:2)如果谁不能取谁就失败. Bouton定理: 必败状态当 ...
- BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基
[题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...
- BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基
一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...
- 编程之美----NIM游戏
: 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他 ...
- [hihoCoder] 博弈游戏·Nim游戏
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏.在 ...
- 1069 Nim游戏
1069 Nim游戏 基准时间限制:1 秒 空间限制:131072 KB 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A ...
随机推荐
- Linux基本概念及操作
基本概念及操作 一.实验介绍 1.1 实验内容: 实验楼环境介绍 常用 Shell 命令及快捷键 Linux 使用小技巧 1.2 实验知识点 Linux 基本命令 通配符的使用 基本软件安装 查看帮助 ...
- 【商业源码】生日大放送-Newlife商业源码分享 -转
http://www.cnblogs.com/asxinyu/p/3225179.html 今天是农历六月二十三,是@大石头的生日,记得每年生日都会有很劲爆的重量级源码送出,今天Newlife群和 ...
- 【剑指offer】二叉树的子结构,C++实现(递归)
原创博文,转载请注明出处! <牛客链接> 1.题目 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:约定空树不是任意一个树的子结构) 图1.二叉树A和二叉树B 2.思路(递归) ...
- Flask第四篇——第一个程序
看,是第一个程序,不是脚本哦~~ 把生成的模板上面加上编码,然后运行,看输出台: 上图中有 Running on http://127.0.0.1:5000/ 点击那个地址,就可以在浏览器看到代码运行 ...
- Django之验证码的生成和使用
1.基于PIL生成一个带验证码的图片和验证码,生成验证码图片需要Monaco.ttf字体,可按自己要求更改check_code中的字体和字体文件位置,如下图 #!/usr/bin/env python ...
- check sub-string in the string
if "blah" not in somestring: continue
- Gixy Nginx 配置分析工具
项目简介 Gixy 是一款用来分析 Nginx 配置的工具. Gixy 的主要目标是防止安全配置错误,并自动进行缺陷检测. 目前支持的 Python 版本是 2.7 和 3.5+ . 免责声明:Gix ...
- unity导入3dsMax源文件.max
https://blog.csdn.net/qq_28002559/article/details/53693621 首先unity导入3dsMax文件为什么要使用.max而不用.fbx,因为我不是做 ...
- Java 设计模式之单例模式(一)
原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...
- 快速创建yii2 RESTful api的小记
1.复制backend的应用到同级目录,改名叫api 2.然后就是配置项修改,common和api目录下的 common下: bootstrap.php最后添加一行配置 api/config/main ...