zoukankan      html  css  js  c++  java
  • 1025. 除数博弈

    爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。

    最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:

    选出任一 x,满足 0 < x < N 且 N % x == 0 。
    用 N - x 替换黑板上的数字 N 。
    如果玩家无法执行这些操作,就会输掉游戏。

    只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。

    示例 1:

    输入:2
    输出:true
    解释:爱丽丝选择 1,鲍勃无法进行操作。
    示例 2:

    输入:3
    输出:false
    解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。
     

    提示:

    1 <= N <= 1000

    解答1

    可以使用闭包把dict变量放到函数里面。这里的思路就是逐级取反。

    let dict = {
    };
    
    var divisorGame = function(N) {
      if(N == 1) {
        dict[N] = false;
        return false;
      }
      for(let i=1; i<N; ++i) {
        if(N % i != 0) continue;
        dict[N] = (N-i) in dict ? !dict[N-i] : !divisorGame(N-i);
        if(dict[N]) {
          return true;
        }
      }
      return false;
    };

    解答2

    求出(N-1)的所有解,然后递推出N的解

    var divisorGame = function (N) {
      let result = [];
      result[1] = false;
      for(let i=2; i<=N; ++i) {
        for(let j=1; j<i; ++j) {
          if(i % j != 0) continue;
          if(!result[i-j]) {
            result[i] = true;
            break;
          } else {
            result[i] = false;
          }
        }
      }
      return result[N];
    }

    解答3(来自leetcode官方解答)

    数字N如果是奇数,它的约数必然都是奇数;若为偶数,则其约数可奇可偶。
    无论N初始为多大的值,游戏最终只会进行到N=2时结束,那么谁轮到N=2时谁就会赢。
    因为爱丽丝先手,N初始若为偶数,爱丽丝则只需一直选1,使鲍勃一直面临N为奇数的情况,这样爱丽丝稳赢;
    N初始若为奇数,那么爱丽丝第一次选完之后N必为偶数,那么鲍勃只需一直选1就会稳赢。

    var divisorGame = function (N) {
      return N % 2 == 0;
    }
  • 相关阅读:
    AngularJS Insert Update Delete Using PHP MySQL
    Simple task manager application using AngularJS PHP MySQL
    AngularJS MySQL and Bootstrap Shopping List Tutorial
    Starting out with Node.js and AngularJS
    AngularJS CRUD Example with PHP, MySQL and Material Design
    How to install KVM on Fedora 22
    Fake_AP模式下的Easy-Creds浅析
    河南公务员写古文辞职信
    AI
    政协委员:最大愿望是让小学生步行上学
  • 原文地址:https://www.cnblogs.com/cheng-up/p/11304145.html
Copyright © 2011-2022 走看看