-
有一头牛和一只羊,都是绝顶聪明,它们比赛吃草,每次只能吃4的n次方的堆数.谁先让对方没有草吃谁赢.
-
规律
- 0 1 2 3 4
- 后 先 后 先 先
package class01;
public class Code02_EatGrass {
public static void main(String[] args) {
for (int i = 0; i <= 50; i++) {
System.out.println(i + " : " + winner1(i));
}
}
// string "先手" "后手" 1 4 16 64 先手后手只能吃4的n次方的份数
public static String winner1(int n) {
if (n < 5) { // base case
return (n == 0 || n == 2) ? "后手" : "先手";
}
// n >= 5 时
int base = 1; // 当前先手决定吃的草数
// 当前是先手在选
while (base <= n) {
// 当前一共n份草,先手吃掉的是base份,n - base 是留给后手的草
// 母过程 先手 在子过程里是 后手
if (winner1(n - base).equals("后手")) {
return "先手";
}
if (base > n / 4) { // 防止base*4之后溢出
break;
}
base *= 4;
}
return "后手";
}
public static String winner2(int n) {
if (n % 5 == 0 || n % 5 == 2) {
return "后手";
} else {
return "先手";
}
}
}
- javascript版本
// 有一头牛和一只羊,都是绝顶聪明,它们比赛吃草,每次只能吃4的n次方的堆数.谁先让对方没有草吃谁赢.
function winner(n) {
if(n < 5) {
return (n == 0 || n == 2) ? '后手' :'先手'
}
// n>=5
let base = 1 // 当前先手决定吃的草数
while(base <= n) {
if(winner(n - base) == '后手') {
return '先手'
}
if(base * 4 > n) break
base *= 4
}
return '后手'
}
function winner1(n) {
if(n % 5 == 0 || n % 5 == 2) {
return '后手'
}else {
return '先手'
}
}
console.log(winner(9) == winner1(9))
console.log(winner(19) == winner1(19))
console.log(winner(29) == winner1(29))
console.log(winner(39) == winner1(39))