Python程序:检查阿玛尔能否赢得石头游戏
假设有两个玩家阿玛和比马尔,他们正在玩一个游戏,阿玛先行。最初,堆中有n个不同的石头。在每个玩家的回合中,他会移除堆中任意数量的平方数(非零)石头。如果一个玩家不能移动,他就输了。因此,如果我们有n,我们必须检查Amal能否赢得游戏。
因此,如果输入如n = 21,则输出将为True,因为阿玛将首先取16,然后Bimal取4,然后阿玛取1并赢得比赛。
要解决此问题,我们将遵循以下步骤:
- squares:=新列表
-
square:=1
-
增加:=3
-
while square <= n,do
- 在squares的末尾插入平方数
-
square:= square + increase
-
increase:= increase + 2
-
将平方插入到squares的末尾
-
dp:=大小为(n + 1)的空列表
-
dp[0]:= False
-
for k in range 1 to n,do
- s:= 0
-
dp[k]:= False
-
while squares[s] <= k and dp[k]为空,do
- 如果dp[k-squares[s]]为空,则
-
dp[k]:= True
-
s:= s +1
- s:= 0
-
返回dp的最后一个元素
例子
让我们看看以下实现以更好地理解
def solve(n):
squares = []
square = 1
increase = 3
while square <= n:
squares.append(square)
square += increase
increase += 2
squares.append(square)
dp = [None] * (n + 1)
dp[0] = False
for k in range(1, n + 1):
s = 0
dp[k] = False
while squares[s] <= k and not dp[k]:
if not dp[k - squares[s]]:
dp[k] = True
s += 1
return dp[-1]
n = 21
print(solve(n))
输入
21
输出
True