题目如下:
大体意思是:有两个人从一个总数给定的洞里拿石头,每次可以拿的石头的数目(moves)也给出在一个列表中,例如 [1,3,4] .。假设这两个人每次拿的石头都是最优的选择,那么最后先拿石头的赢还是后拿石头的赢呢?
大体思路:
- 先给出一个总元素为石头总数(piles)+1的result列表,除第一个元素为Ture外,其余都为False。
- 从count = 1 开始到 piles,得出第一步可能拿的石头数(possibles),然后看此时result[count - possibles]是否全为Ture(即上一步后手在可以拿的石头总数的情况下都能赢),此时先手必然输;否则,只要result[count - possibles]中有一个False,则先手
- 实际就是 从总数为1到总数为piles一步步推出当前的输赢
程序如下:
def stones(pile,moves):
results=[True]+[False]*pile
for count in range(1, pile+1):
possible = [x for x in moves if count-x >= 0]
results[count] = not(all(results[count - i] for i in possible))
if results[pile]:
return 1
else:
return 2
**扩展:**是否能把最优的拿法打印出来?或者创建一个小游戏(手动自己拿和程序每次都按最优的拿法拿)?