本题考查
尼姆博弈
思路
- 一般尼姆游戏的定义:
有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。 - 将高僧斗法问题转换为尼姆游戏问题:
从第一位和尚开始,每两个组成一组,即第一个与第二个分为一组,第三个与第四个分成一组。每一组后者阶梯数减前者阶梯数再减1作为一组石子堆的石子个数。即四个和尚阶梯数为1 3 5 10,则转化成的尼姆游戏为两堆石子,个数1 4。若是奇数个和尚,则忽略最后一个。此时会有疑问“为什么第二个与第三个不能分成一组”。答,第二个与第三个分成的一组,该组在尼姆游戏中是无效的。举个例子:和尚站位1 3 5 10,则有空位置:1 1 4(因为1和3之间只有2能移动,所以每个空的数量等于后减前再减1),此时某玩家将3移到4,则另一位玩家可以将1移到2,则1 3 5 10与2 4 5 10在尼姆游戏中是等价的,也就是说这种操作对于游戏胜负是没有影响的,相当于什么也没做。类比于石子堆,这种操作相当于两堆石子堆原本距离5m,现在把它们的距离缩短到2m。 - 平衡尼姆游戏:游戏开始时,每一堆石子数量的二进制形式的异或运算结果为0
- 非平衡尼姆游戏:游戏开始时,每一堆石子数量的二进制形式的异或运算结果为1
- 任何玩家无论先后手,当在其操作时遇到平衡情况,则该玩家必输
- 先手玩家在非平衡尼姆游戏获胜、后手玩家在平衡尼姆游戏获胜。
根据以上的分析,我们便可以得到解题思路:
- 读取完和尚的站位后进行判断,若该站位等价的尼姆游戏情况是非平衡的,则先手赢;否则,直接输出-1
- 遍历每个和尚的每个可能放置位置,若将X位置的和尚放到Y位置后形成了平衡局面(即后手玩家在其操作时碰到了平衡局面),则先手获胜,输出“X Y”。
AC代码
import java.util.Scanner;
public class Main {
static int arr[];
static boolean isBalanced() {
int sum = 0;
for(int i=0;i<arr.length-1;i+=2)
sum = sum^(arr[i+1]-arr[i]-1);
if(sum!=0) return false;
return true;
}
public static void main(String[] args) {
Scanner scaner =new Scanner(System.in);
String[] tempArr =scaner.nextLine().split(" ");
scaner.close();
arr =new int[tempArr.length];
for(int i=0;i<tempArr.length;i++) arr[i]=Integer.parseInt(tempArr[i]);
if(isBalanced()) System.out.println("-1");
else
for(int i=0;i<arr.length-1;i++) {
int org=arr[i];
for(int j=arr[i]+1;j<arr[i+1];j++) {
arr[i]=j;
if(isBalanced()) {System.out.println(org+" "+arr[i]); return;}
}
arr[i]=org;
}
}
}