先来看看Nim定理:

 //  若干堆硬币,二人轮流取,从一堆硬币中取几个  直到某个人不能取硬币  那这个人就输了
// 3 4 5
// 3 3 把硬币变成相同的 那么你就赢了 因为你可以跟着另一个人一样的取法
// 尼姆定理: 无偏差的二人游戏 ===== 尼姆堆
/*
* 11
* 100
* ^ 101
* ------------
* 010
* 先手:若非 0,必赢,因为可以把局面变成0这个局面
* 若是 0,必输,因为这个局面本身就是赢的,你随便动一步,那另一个人保持跟你同步,所以最后必输。
*/
public class Nim { public static void main(String[] args) {
int []A = {3,3};
boolean res = solve(A);
System.out.println(res);
} static boolean solve(int []A){
int res = 0;
for (int i = 0; i < A.length; i++) {
res ^= A[i];
}
System.out.println(Integer.toBinaryString(res));
return res !=0;
} }

  再来看这道题目:

  

  我们可以将和尚从后往前(从左到右)两两配对,若为奇数则在最高位补充一个假想的和尚,在同一对和尚中,如果对手移动前一个和尚,你总能移动后一个和尚相同的步数,所以一对和尚的前一个和尚与前面一对和尚的后一个和尚之间有多少台阶是没有影响的。所以只要考虑同一对和尚之间有多少台阶就行了,这样就转化为了Nim游戏。

  如图: a与b配对, c与d配对 ,那么b与c之间的台阶是没有影响的,无论b怎么移动,a总能够移动相同的步数。如果该Nim游戏为必胜,那么我们只要移动配对和尚中的后一和尚就好了,如果对手想要破坏这种Nim游戏,即他想移动配对中的前一和尚,那么我们可以移动后面一对的前一个和尚使得依然保持Nim游戏的局势。如果Nim游戏必败,那么先手者可能想破坏Nim游戏,那么后手者按照刚才的方式保持Nim游戏即可。

  代码:

 import java.util.Scanner;

 //   高僧斗法  所有这类的博弈问题都可以归结为尼姆游戏 Nim
/*
* 高僧斗法 =====> 尼姆游戏
* 把小和尚位置间的空隙 === > 尼姆堆
* 偶数:两两组合
* 奇数:在最高阶补充一个假想的小和尚
*
*/
public class Test { public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String A = in.nextLine();
String[] arrayA = A.split(" ");
int[] NimHeap = new int[arrayA.length - 1];
for(int i = 1;i < arrayA.length;i++)
// 两个和尚的间距作为尼姆堆
NimHeap[i - 1] = Integer.valueOf(arrayA[i]) - Integer.valueOf(arrayA[i - 1]) - 1;
int sum = 0; // i+2 就是为了用一个for实现n为奇和偶的两种情况,奇数时最后一个数不分到组中,偶数时需要将其分到组中。
for(int i = 0;i < NimHeap.length;i = i + 2)
sum ^= NimHeap[i]; if(sum == 0)
System.out.println("-1");
else {
for(int i = 0;i < arrayA.length - 1;i++) {
for(int j = 1;j + Integer.valueOf(arrayA[i]) < Integer.valueOf(arrayA[i + 1]);j++) {
NimHeap[i] -= j;
if(i != 0)
NimHeap[i - 1] += j;
sum = 0;
for(int k = 0;k < NimHeap.length;k = k + 2)
sum ^= NimHeap[k];
if(sum == 0) {
System.out.println(arrayA[i]+" "+(Integer.valueOf(arrayA[i])+j));
return;
}
NimHeap[i] += j;
if(i != 0)
NimHeap[i - 1] -= j;
}
}
}
}
}

  结果:

    

【Nim游戏】高僧斗法的更多相关文章

  1. 高僧斗法(nim博弈)----------蓝桥备战系列

    标题:高僧斗法 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有"高僧斗法"的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地上"画" ...

  2. 算法笔记_186:历届试题 高僧斗法(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地 ...

  3. Java实现蓝桥杯历届试题高僧斗法

    历届试题 高僧斗法 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有"高僧斗法"的趣味节目,以 ...

  4. Nim游戏

    目前有3堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:1)每一步应取走至少一枚石子:每一步只能从某一堆中取走部分或全部石子:2)如果谁不能取谁就失败. Bouton定理: 必败状态当 ...

  5. BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基

    [题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...

  6. 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Stat ...

  7. 【BZOJ】3105: [cqoi2013]新Nim游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意:k堆火柴,先手和后手在第一次拿的时候都能拿若干整堆火柴(但不能拿完),之后和nim游戏规 ...

  8. BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基

    一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...

  9. 编程之美----NIM游戏

    : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他 ...

随机推荐

  1. MySQL 慢查询日志分析工具(pt-query-digest)

    1. 慢查询命令: 是否开启和日志路径:show variables like '%slow_query_log%'; 最大查询时间:show variables like '%query_time% ...

  2. jQuery配合html2canvas 使用时 报错 Uncaught (in promise) Provided element is not within a Document

    报错代码: 这个函数运行时 function download(){ var element = $("#demo"); //jquery 获取元素 //这里将会报错 html2c ...

  3. plsql developer 中文乱码(???)解决办法

    添加环境变量 变量名称: NLS_LANG 内容: SIMPLIFIED CHINESE_CHINA.ZHS16GBK 再次新插入的数据就不会乱码了

  4. struts2-第一章-基础用法3

    一,结果类型配置 在之前servlet学习中,知道网页页面路径跳转有两种方式,内部跳转(请求转发)和外部跳转(重定向),两者的区别,内部跳转浏览器地址不会变化 可以保存上一次请求的数据 外部跳转浏览器 ...

  5. PHP使用urlencode对中文编码时空格、加号的问题

    使用urlencode这个函数进行格式化,urlencode函数会把空格编码为为:+ 当然,前端在接收时可以解码后进行替换 + 为空格的方式处理. 但是这样就多做了一步,很麻烦,有的时候我们的数据接口 ...

  6. 关于tomcat WEB-INF/lib下类加载顺序

    关于tomcat WEB-INF/lib下类加载顺序问题 问题描述 smc应用最近碰到一个线上问题,预发机器规则测试接口没问题,但是线上机器就是调用有问题,表面上看,maven模块引用的是自己想要的j ...

  7. *CTF 2019 quicksort、babyshell、upxofcpp

    这次参加比赛总共出了三道,有两道队友都先交了,还是tcl,heap_master卡了差不多一天没解决....还是记录一下出的题目吧 quicksort 题目大体流程就是输入要输入的数字数量,然后输入数 ...

  8. git使用命令讲解

    1.创建版本库 ①选择一个合适的地方,创建一个空目录   mkdir learngit cd learngit ②通过git init命令把这个目录变成Git可以管理的仓库: git init Git ...

  9. 闲谈REST API

    REST 表述性状态传递(英文:Representational State Transfer,简称REST). 资源: 资源由URI(统一资源定位符)的来指定. 通过资源的表现形式来操作资源 对资源 ...

  10. mybatis中有趣的符号#与$

    ${ }是字符串替换,相当于直接显示数据,#{ }是预编译处理,相当于对数据加上双引号 即#是将传入的值当做字符串的形式,先替换为?号,然后调用PreparedStatement的set方法来赋值,而 ...