先来看看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. SQL语句完整的执行顺序(01)

    一.sql语句的执行步骤:  1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义.  2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限.  3)视图转换,将涉 ...

  2. 《剑指offer》左旋转字符串

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  3. iOS开发之Dictionary与NSData互转

    1.将NSData转换成Dictionary /** 将二进制数据转换成字典*/ + (NSDictionary *)dictionaryForJsonData:(NSData *)jsonData ...

  4. python3.0j基语法-01

    python基础语法,字符编码,python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) print("Hello word") 一个简单hello ...

  5. Python3学习笔记十五

    ---恢复内容开始--- 1.  jquery的属性操作  $().attr(属性名)    取值 $().attr(属性名,属性值)      赋值 <!DOCTYPE html> &l ...

  6. 解决ODBC连接Oracle数据库报Unable to connect SQLState=08004问题

    今天用ODBC连接Oracle数据库时,报了这么一个错“Unable to connect SQLState=08004 Oracle ODBC Ora-12154”,上网查了好久都说PowerDes ...

  7. jq判断是PC还是手机端的方法

    $(function(){ //判断是否是手机 var mobile_flag = isMobile(); if(mobile_flag){ $('.now_qq').attr('href',&quo ...

  8. [转] 初探webpack4

    一.前言 2018/2/25,webpack4正式发布,距离现在已经过去三个多月了,也逐渐趋于稳定,而且现在的最新版本都到了4.12.0(版本迭代快得真是让人害怕). 很多人都说webpack复杂,难 ...

  9. .NET Core on K8S快速入门课程学习笔记

    课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 目录 01-介绍K8s是什么 02-为什么要学习k8s 03-如何学习k8s ...

  10. rpm和yum软件管理

    rpm简介 数据库管理工具,通过读取数据库,判断软件是否安装,如已安装可读取出来所有文件的所在位置等,并可以实现删除这些文件. rpm:RPM is Redhat Package Manager(递归 ...