【发布时间】:2017-11-06 11:09:26
【问题描述】:
我遇到了this question。根据问题:
‘samu’和‘vibhu’正在玩一个游戏,桌子上有从 1 到 N 的 N 个整数。在每一轮中,玩家可以从之前未访问的整数中选择一个整数来标记为已访问。如果在一个回合中,玩家选择一个完成三个连续数字的选择的数字,他就赢了。即,假设在游戏的某个阶段,如果玩家现在选择 3,则已经选择(访问)了 2 和 4,则他获胜。假设 samu 首先开始,并且两个玩家都发挥得非常好,那么谁是赢家。
我尝试应用 WL 算法(正确理解后)described here 即:
boolean isWinning(position pos) {
moves[] = possible positions to which I can move from the position pos;
for (all x in moves)
if (!isWinning(x)) return true;
return false;
}
所以,我的代码是(在适当修改 WL 算法之后):
public class HelloWorld{
public static boolean[] visited;
public static int n;
public static void main(String []args){
n=12;
visited=new boolean[n];
java.util.Arrays.fill(visited,false);
for(int i=0; i<n; i++){
visited[i]=true;
if(isWinning(i)){
System.out.println("first one wins");
System.exit(0);
}
visited[i]=false;
}
System.out.println("second one wins");
}
public static boolean isWinning(int x){
if(threeStrikes()){
return true;
}
for(int i=0; i<n; i++){
if(!visited[i]){
visited[i]=true;
if(!isWinning(i)){
return true;
}
visited[i]=false;
}
}
return false;
}
public static boolean threeStrikes(){
for(int i=0; i<n-2; i++){
if(visited[i]&&visited[i+1]&&visited[i+2]){
return true;
}
}
return false;
}
}
问题在于它会在 n=6 时打印“第一个获胜”。在this discussion 线程中,操作员说对于 n=6,第二个应该获胜。我不知道他是否错了,或者我的代码是否遗漏了什么。任何帮助表示赞赏。
【问题讨论】:
标签: algorithm recursion game-theory minmax