我正在使用回溯递归来解决以下问题。第一个代码“ CoinGame1”提供正确的解决方案,但是第二个代码“ CoinGame2”提供错误的解决方案。我想,发生了一些不好的事情,因为我在递归调用之前先将字符串反转了。
*硬币游戏:爱丽丝和鲍勃正在使用一堆硬币玩游戏。玩家依次从堆中挑出几个硬币。每个玩家每回合可以选择1,2或4个硬币。每次允许玩家挑选硬币时,获得最后一个硬币的玩家就是获胜者。众所周知,最后剩下1,2或4个硬币时,首轮玩家肯定会根据需要选择1,2或4个硬币并获胜。例如,如果最后有2个硬币并且爱丽丝是第一个选择的玩家,那么她肯定会选择2个硬币并获胜。给定硬币数量和玩家顺序(这意味着第一和第二位玩家选择硬币),编写一个程序来打印游戏获胜者的所有可能性,
F(1,{alice,bob})
爱丽丝
F(6,{alice,bob})
爱丽丝,鲍勃,鲍勃,爱丽丝,鲍勃,鲍勃
F(4,{alice,bob})
爱丽丝
F(3,{alice,bob})
鲍勃,鲍勃*
f(6,{A,B})
/ \ \
f(5,{B,A})f(4,{B,A})f(2,{B,A})
/ | \ B胜B胜
f(4,{A,B})f(3,{A,B})f(1,{A,B})
胜利/ | \一胜
/ | \
f(2,{B,A})f(1,{B,A})f(-1,{B,A})
B胜B胜
//解决方案1
public class CoinGame1
{
public static void Count(int n, String[] s) // n: no. of coins
//s:{"Alice","Bob"} (order)
{
if(n>0)
{
if(n==1 || n==2 || n==4) System.out.println( s[0] ); // if 1/2/4
//coins left, the one with first chance wins
else
{
Count(n-1,new String[]{s[1],s[0]});
Count(n-2,new String[]{s[1],s[0]});
Count(n-4,new String[]{s[1],s[0]});
}
}
}
java CoinGame1 A B B A B B
//解决方案2
public class CoinGame2
{
public static void Count(int n, String[] s) // n: no. of coins
//s:{"Alice","Bob"} (order)
{
if(n>0)
{
if(n==1 || n==2 || n==4) System.out.println( s[0] ); // if 1/2/4
//coins left, the one with first chance wins
else
{
String temp = s[0]; s[0] = s[1]; s[1] = temp; // reverse s
Count(n-1,s);
Count(n-2,s);
Count(n-4,s);
}
}
}
java CoinGame2 A B B B B B
紫衣仙女
智慧大石
相关分类