一、减法游戏
-
初始有一个数 n。
-
两个玩家轮流操作,每次可以减去 1 到 9 之间的任意整数。
-
将数减到 0 的玩家获胜。
可以发现规律:
减法游戏只需要判断当前数取模是否为0,即可快速判断胜负。
例题:
Leetcode 292. Nim 游戏
二、取球博弈
两个人玩取球的游戏。一共有 N个球,每人轮流取球,每次可取集合 n1,n2,n3中的任何一个数目。如果无法继续取球,则游戏结束。此时,持有奇数个球的一方获胜。
如果两人都是奇数,则为平局。假设双方都采用最聪明的取法第一个取球的人一定能赢吗?试编程解决这个问题。
该题是一个典型的博弈论问题,涉及取球游戏和奇偶性判断。这里使用动态规划来解决此问题,我们需要递推出来N之前的所有dp值。因为要考虑双方手里的球的奇偶性,因为有三种状态,平手状态需要考虑对方是否也处于必败态。
N = [int(x) for x in input().split()]
X = [int(x) for x in input().split()]
min_value = min(N)
dp = [[[-1 for _ in range(2)] for _ in range(2) ]for _ in range(1000)]
for i in range(1000):
if i < min_value:
dp[i][0][0] = 0
dp[i][0][1] = -1
dp[i][1][0] = 1
dp[i][1][1] = 0
for id, c in enumerate(N):
temp = i - c
if temp >= 0:
dp[i][0][0] = max(dp[i][0][0], -dp[temp][0][c % 2])
dp[i][0][1] = max(dp[i][0][1], -dp[temp][1][c % 2])
dp[i][1][0] = max(dp[i][1][0], -dp[temp][0][(c + 1) % 2])
dp[i][1][1] = max(dp[i][1][1], -dp[temp][1][(c + 1) % 2])
for i in range(len(X)):
if dp[X[i]][0][0] == 1:
print("+",end=" ")
elif dp[X[i]][0][0] == 0:
print("0",end=" ")
else:
print("-",end=" ")