羊和牛吃草问题

24 阅读1分钟
  • 有一头牛和一只羊,都是绝顶聪明,它们比赛吃草,每次只能吃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))