理解好必胜策略很重要。
public class NewClass {
static String nim(int x,int y){
if(x==y){
return “我先取,我必赢”;
}
if(x>y){
int a =x;
x=y;
y=a;
}
if(x==1 && y ==2){
return “我先取,我必输”; //这里的必输是指对手没有故意放水。如果对方先取,无论对方怎么取,我都有赢的办法,即必胜
}
List list = new ArrayList(); //list中存放的是bn的值
List list_a = new ArrayList(); //list_a中存放的是an的值
int a=1; //a表示an
list.add(2); //b1=2,a1=1;
list_a.add(1);
int n =1; //n表示an中的下标n
//寻找小于等于x的不安全局面,即构造不安全局面
while(x>a){
boolean flag = true;
int num =++a;
for(int i =0;i<list.size();i++){
if((int)list.get(i)==num){
flag = false;
break;
}
}
if(flag){
n++;
list.add(n+a);
list_a.add(a);
}
}
System.out.println(“an=”+list_a.toString());
System.out.println(“bn=”+list.toString());
if(x==a){
for(int i =0;i<list.size();i++){
if(y ==(int)list.get(i)){
return “我先取,我没有必胜策略”;
}
}
return “我先取,我有必胜策略”;
}else{
return “我先取,我有必胜策略”;
}
}
public static void main(String[] args){
String str = nim(9,15);
System.out.println(str);
}
}