「懒人妙计」蓝桥杯----取球博弈

今盒子里有n个小球,A、B两人轮流从盒中取球,每个人从盒子中取出的球的数目必须是:1,3,7或者8个。
    A先取球,然后双方交替取球,直到取完。
    被迫拿到最后一个球的一方为负方(输方)
    请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?
 

public class main2 {
	static Map map=new HashMap();
    public static void main(String[] args) {
    	map.put(0,true);
    	System.out.print(f(1155));
        
    }

	private static boolean f(int n) {
		boolean t=false;
		if(map.get(n)!=null)return (boolean)map.get(n);//储存重复子问题 节约时间
		//如果对手拿到最后一个球则return true
		if(n>1&&!f(n-1)) t=true;//我取完一个球 剩下的局面对手认为会输 我就赢了
		if(n>3&&!f(n-3)) t=true;
		if(n>7&&!f(n-7)) t=true;
		if(n>8&&!f(n-8)) t=true;
		map.put(n, t);
		return t;//底层为false
	}

}

思路:

让敌方去思考和判断

这道题用到了动态规划

递归:我取完一个球 剩下的局面对手认为会输 对方拿到最后一个球 我赢

如果对手判断可以赢 那我就必输

重叠子问题:map来存储算过的结果 

例如一共三个球 我方输 

如果变成四个球 我取一个球 对方剩三个球 刚刚计算过三个球为输 则省去了重复计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值