取球博弈
有一堆小球(总数:10),规则为:两方轮流取球,每次只能取固定数目:1,3,7,8;轮到某一方取球时,若无法执行该规则,则判该方为输的一方。(己方先取)
package bishi;
public class MyGameTheory {// 必胜返回true
// x为当前剩余球的数目,我方取球,若必赢;返回true;否则返回false.
public static boolean fun(int x) {
int[] op = { 1, 3, 7, 8 };// 每次只能取的球数为1,3,7,8
for (int i = 0; i < op.length; i++) {
if (x >= op[i]) {// 操作可行,取op[i]个球,剩余x-op[i]
if (fun(x - op[i]) == false) {// 对方必输,递归
return true;// 己方必赢
}
}
}
return false;// 无论如何取球,对方必赢,则己方必输
}
// 在剩余x球时,我方先取球的结局如何?
public static void main(String[] args) {
// 己方试着取一次,看对方的返回结果,若为false,则己方必赢;否则己方必输。
System.out.println(fun(10));
}
}
思路:
局面----走一步----新局面
初始局面---树根
寻找增加获胜概率(对己方有利)的路径
特点:
在博弈树中,越是靠近叶子节点,节点数目越多。会有大量重复运算,可以使用dp记录中间(子问题)结果。