与其明天开始,不如现在行动!
牛羊吃草
1 题目描述
给定一个正整数N,表示有N份青草统一堆放在仓库里有一只牛和一只羊,牛先吃,羊后吃,它俩轮流吃草不管是牛还是羊,每一轮能吃的草量必须是1,4,16,64…(4的某次方),谁最先把草吃完,谁获胜。假设牛和羊都绝顶聪明,都想赢,都会做出理性的决定。根据唯一的参数N,返回谁会赢
2 解决思路
- 输入简单:N份青草,返回值简单:谁赢
- 暴力方法打表,找规律
- 根据规律优化代码
3 代码实现
暴力方法打表:
public class EatGrass {
public static String winner(int num) {
if (num < 5) {
return (num == 0 || num == 2) ? "后手" : "先手";
}
// 假定先手要吃的数量
int base = 1;
while (base <= num) {
if (winner(num - base).equals("后手")) {
return "先手";
}
//防止溢出
if (base > num / 4) {
break;
}
base *= 4;
}
return "后手";
}
public static void main(String[] args) {
for (int num = 0; num <= 100; num++) {
System.out.println(num + ":" + winner(num));
}
}
}
规律:
随着草的份数的增加,赢得规律是:后先后先先,每五个循环。
优化code:
public class EatGrass {
public static String winnerAwesome(int num) {
if (num % 5 == 0 || num % 5 == 2) {
return "后手";
}
return "先手";
}
public static void main(String[] args) {
int N = 50;
System.out.println(winnerAwesome(N));
}
}
💎总结
本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!