一、減法游戲
-
初始有一個數 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] = 0dp[i][0][1] = -1dp[i][1][0] = 1dp[i][1][1] = 0for id, c in enumerate(N):temp = i - cif 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=" ")