博弈论+递归 甲乙拿球谁赢

154 阅读1分钟

题目

JWI4E3X))8_J_M`W3OF)K{T.png

  • 通过递归遍历所有情况,然后通过打表找规律,遍历甲能拿的所有情况,然后乙能拿的所有情况
// balls 只能是奇数
function main(balls) {
  process(0, balls, 0, 0);

  // ture: 0 甲回合、1 乙回合
  // jBalls、yBalls: 甲、乙拿到的球数
  function process(turn, rest, jBalls, yBalls) {
    if (rest === 0) {
      return jBalls % 2 === 0 ? "甲" : "乙";
    }
    // 甲拿
    if (turn === 0) {
      // 剩余球数可能小于3不够了
      // 遍历甲的所有情况
      for (let i = 1; i <= Math.min(rest, 3); i++) {
        // 甲拿了乙拿
        if (process(1, rest - i, jBalls + i, yBalls) === "甲") {
          return "甲";
        }
      }
      return "乙";
    } else {
      // 剩余球数可能小于3不够了
      // 遍历乙的所有情况
      for (let i = 1; i <= Math.min(rest, 3); i++) {
        // 乙拿了甲拿
        if (process(0, rest - i, jBalls, yBalls + i) === "乙") {
          return "乙";
        }
      }
      return "甲";
    }
  }
}

// 打表找规律
for (let i = 1; i <= 500; i += 2) {
  main(i);
}

image.png