本题考查

尼姆博弈

思路

  • 一般尼姆游戏的定义:
    有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。
  • 将高僧斗法问题转换为尼姆游戏问题:
    从第一位和尚开始,每两个组成一组,即第一个与第二个分为一组,第三个与第四个分成一组。每一组后者阶梯数减前者阶梯数再减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. 读取完和尚的站位后进行判断,若该站位等价的尼姆游戏情况是非平衡的,则先手赢;否则,直接输出-1
  2. 遍历每个和尚的每个可能放置位置,若将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;
			}
	}
}