牛羊吃草问题(打表技巧)

public class test24 {
    // 给一个正整数N,表示有N份青草放在仓库里
    // 有一只牛和一只羊,牛先吃,羊后吃,每一轮吃草量为4的某次方
    // 谁先把草吃完,谁获胜,若羊和牛都想赢,都会做出合理的选择。返回谁会赢

    public static String winner1(int n){
        // 如果青草数量小于5,根据规则直接判断胜负
        if(n < 5){
            return (n == 0 || n == 2) ? "后手" : "先手";
        }
        // 初始化基数为1,用于计算每轮吃的草的数量
        int base = 1;
        // 当基数小于等于青草数量时,进行循环
        while (base <=  n ){

            // 如果减去当前基数后的青草数量,如果后序过程还能赢(后序过程是后手),则当前获胜
            if(winner1(n - base).equals("后手")){
                return "先手";
            }
            // 防止base*4后溢出
            if(base > n/4){
                break;
            }
            // 基数乘以4,进入下一轮
            base *= 4;
        }
        // 其他情况下,后手获胜
        return "后手";
    }

    public static void main(String[] args) {
        for (int i = 0; i <= 50; i++) {
            System.out.println(i + ":" + winner1(i));
        }
        //发现每五个一循环为后先后先先
    }

    //根据打表的规律重现优化代码
    public static String winner2(int n){
        if(n%5 == 0 || n%5 == 2){
            return "后手";
        }else{
            return "先手";
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值