题目:
古时丧葬活动中经常请高僧做法事。
仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛。节目大略步骤为:先用粮食(一般是稻米)在地上“画”出若干级台阶(表示N级浮屠)。
又有若干小和尚随机地“站”在某个台阶上。
最高一级台阶必须站人,其它任意。(如图所示)
两位参加斗法的法师分别指挥某个小和尚向上走任意多级的台阶,但会被站在高级台阶上的小和尚阻挡,不能越过。
两个小和尚也不能站在同一台阶,也不能向低级台阶移动。
两法师轮流发出指令,最后所有小和尚必然会都挤在高段台阶,再也不能向上移动。
轮到哪个法师指挥时无法继续移动,则游戏结束,该法师认输。
对于已知的台阶数和小和尚的分布位置,请你计算先发指令的法师该如何决策才能保证胜出。
输入数据为一行用空格分开的N个整数,表示小和尚的位置。台阶序号从1算起,所以最后一个小和尚的位置即是台阶的总数。(N<100, 台阶总数<1000)
输出为一行用空格分开的两个整数: A B, 表示把A位置的小和尚移动到B位置。
若有多个解,输出A值较小的解,若无解则输出-1。
例如:
用户输入:
1 5 9
则程序输出:
1 4
再如:
用户输入:
1 5 8 10
则程序输出:
1 3
分析:构造尼姆堆,相邻两个和尚的差构造成一个堆。观察得,无论怎么移动一对和尚中的第二个和尚,接下来的人都可以跟着移动前一个和尚,堆的状态没有改变。
public class _5_博弈_05高僧斗法 {
public static int yihuo (int []arr)
{
int x = 0 ;
for(int i=0;i<arr.length-1;i+=2)
x^=arr[i+1]-arr[i]-1;
return x;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
String st[] = s.split(" ");
int[] arr = new int[st.length];
for(int i=0;i<arr.length;i++)
arr[i]=Integer.parseInt(st[i]);
if(yihuo(arr)==0) //已为必败态,输出-1
{
System.out.println(-1);
}
else
{
for(int i=0;i<arr.length-1;i++) //每一位都作尝试
{
int old = arr[i]; //存入原数据 好回溯
try{
while(arr[i]<arr[i+1]-1)
{
arr[i]++;
if(yihuo(arr)==0)
{
System.out.println(old+" "+arr[i]);
return ;
}
}
}
finally{
arr[i]=old;
}
}
}
}
}