尼姆问题原理:点此链接
POJ1704 Georgia and Bob
异或运算 题意:每次玩家选择一个棋子时,将其向左移动而不会越过其他棋子或越过左边缘。玩家可以自由选择棋子移动的步数,但必须限制棋子至少移动一步,并且一个网格最多只能包含一个棋子。无法采取行动的玩家将输掉比赛。
import java.util.Arrays;
import java.util.Scanner;
/**
* @author wl
* @Data 2020-03-10 9:45
* nim问题
*/
public class POJ1704 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] data = new int[n][];
for (int i = 0; i < n; i++) {
int k = sc.nextInt();
data[i] = new int[k];
for (int j = 0; j < k; j++) {
data[i][j] = sc.nextInt();
}
}
for (int i = 0; i < n; i++) {
String res = deal(data[i]);
System.out.println(res);
}
}
static String deal(int[] A){
int len = A.length;
Arrays.sort(A);
int res = 0;
if ((len&1)==1){ //奇数
for (int i = 0; i < len; i+=2) {
res ^= (i==0)?(A[i]-1):(A[i]-A[i-1]-1);
}
}else{
for (int i = 1; i < len; i++) {
res ^= (A[i]-A[i-1]-1);
}
}
if (res==0){
return "Bob will win";
}else{
return "Georgia will win";
}
}
}
高僧斗法:
import java.util.Arrays;
import java.util.Scanner;
/**
* @author wl
* @Data 2020-03-10 15:35
*/
public class 高僧斗法 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
sc.close();
String[] s = str.split(" ");
int[] arr = new int[s.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(s[i]);
}
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 (deal(arr)){
System.out.println(org+" "+arr[i]);
return;
}
}
arr[i] = org;
}
System.out.println(-1);
}
static boolean deal(int[] A){
int len = A.length;
//Arrays.sort(A);
int res = 0;
//if ((len&1)==1){ //奇数
for (int i = 0; i < len-1; i+=2) {
res ^= (A[i+1]-A[i]-1);
}
// }else{
/* for (int i = 1; i < len; i++) {
res ^= (A[i]-A[i-1]-1);
}
}*/
if (res==0){
return true;
}else{
return false;
}
}
}