博弈树

取球博弈

博弈树_第1张图片

有一堆小球(总数: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记录中间(子问题)结果。


你可能感兴趣的:(C,C++,Java,Data,structure,and,algorithm)