返回介绍

solution / 1500-1599 / 1510.Stone Game IV / README_EN

发布于 2024-06-17 01:03:18 字数 5750 浏览 0 评论 0 收藏 0

1510. Stone Game IV

中文文档

Description

Alice and Bob take turns playing a game, with Alice starting first.

Initially, there are n stones in a pile. On each player's turn, that player makes a _move_ consisting of removing any non-zero square number of stones in the pile.

Also, if a player cannot make a move, he/she loses the game.

Given a positive integer n, return true if and only if Alice wins the game otherwise return false, assuming both players play optimally.

 

Example 1:

Input: n = 1
Output: true
Explanation: Alice can remove 1 stone winning the game because Bob doesn't have any moves.

Example 2:

Input: n = 2
Output: false
Explanation: Alice can only remove 1 stone, after that Bob removes the last one winning the game (2 -> 1 -> 0).

Example 3:

Input: n = 4
Output: true
Explanation: n is already a perfect square, Alice can win with one move, removing 4 stones (4 -> 0).

 

Constraints:

  • 1 <= n <= 105

Solutions

Solution 1

class Solution:
  def winnerSquareGame(self, n: int) -> bool:
    @cache
    def dfs(i: int) -> bool:
      if i == 0:
        return False
      j = 1
      while j * j <= i:
        if not dfs(i - j * j):
          return True
        j += 1
      return False

    return dfs(n)
class Solution {
  private Boolean[] f;

  public boolean winnerSquareGame(int n) {
    f = new Boolean[n + 1];
    return dfs(n);
  }

  private boolean dfs(int i) {
    if (i <= 0) {
      return false;
    }
    if (f[i] != null) {
      return f[i];
    }
    for (int j = 1; j <= i / j; ++j) {
      if (!dfs(i - j * j)) {
        return f[i] = true;
      }
    }
    return f[i] = false;
  }
}
class Solution {
public:
  bool winnerSquareGame(int n) {
    int f[n + 1];
    memset(f, 0, sizeof(f));
    function<bool(int)> dfs = [&](int i) -> bool {
      if (i <= 0) {
        return false;
      }
      if (f[i] != 0) {
        return f[i] == 1;
      }
      for (int j = 1; j <= i / j; ++j) {
        if (!dfs(i - j * j)) {
          f[i] = 1;
          return true;
        }
      }
      f[i] = -1;
      return false;
    };
    return dfs(n);
  }
};
func winnerSquareGame(n int) bool {
  f := make([]int, n+1)
  var dfs func(int) bool
  dfs = func(i int) bool {
    if i <= 0 {
      return false
    }
    if f[i] != 0 {
      return f[i] == 1
    }
    for j := 1; j <= i/j; j++ {
      if !dfs(i - j*j) {
        f[i] = 1
        return true
      }
    }
    f[i] = -1
    return false
  }
  return dfs(n)
}
function winnerSquareGame(n: number): boolean {
  const f: number[] = new Array(n + 1).fill(0);
  const dfs = (i: number): boolean => {
    if (i <= 0) {
      return false;
    }
    if (f[i] !== 0) {
      return f[i] === 1;
    }
    for (let j = 1; j * j <= i; ++j) {
      if (!dfs(i - j * j)) {
        f[i] = 1;
        return true;
      }
    }
    f[i] = -1;
    return false;
  };
  return dfs(n);
}

Solution 2

class Solution:
  def winnerSquareGame(self, n: int) -> bool:
    f = [False] * (n + 1)
    for i in range(1, n + 1):
      j = 1
      while j <= i // j:
        if not f[i - j * j]:
          f[i] = True
          break
        j += 1
    return f[n]
class Solution {
  public boolean winnerSquareGame(int n) {
    boolean[] f = new boolean[n + 1];
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= i / j; ++j) {
        if (!f[i - j * j]) {
          f[i] = true;
          break;
        }
      }
    }
    return f[n];
  }
}
class Solution {
public:
  bool winnerSquareGame(int n) {
    bool f[n + 1];
    memset(f, false, sizeof(f));
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= i / j; ++j) {
        if (!f[i - j * j]) {
          f[i] = true;
          break;
        }
      }
    }
    return f[n];
  }
};
func winnerSquareGame(n int) bool {
  f := make([]bool, n+1)
  for i := 1; i <= n; i++ {
    for j := 1; j <= i/j; j++ {
      if !f[i-j*j] {
        f[i] = true
        break
      }
    }
  }
  return f[n]
}
function winnerSquareGame(n: number): boolean {
  const f: boolean[] = new Array(n + 1).fill(false);
  for (let i = 1; i <= n; ++i) {
    for (let j = 1; j * j <= i; ++j) {
      if (!f[i - j * j]) {
        f[i] = true;
        break;
      }
    }
  }
  return f[n];
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文