欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

py.checkio Escher 中 The Stones实例(python)

程序员文章站 2022-06-26 12:53:46
...

题目如下:
py.checkio Escher 中 The Stones实例(python)py.checkio Escher 中 The Stones实例(python)py.checkio Escher 中 The Stones实例(python)

大体意思是:有两个人从一个总数给定的洞里拿石头,每次可以拿的石头的数目(moves)也给出在一个列表中,例如 [1,3,4] .。假设这两个人每次拿的石头都是最优的选择,那么最后先拿石头的赢还是后拿石头的赢呢?
大体思路:

  1. 先给出一个总元素为石头总数(piles)+1的result列表,除第一个元素为Ture外,其余都为False。
  2. 从count = 1 开始到 piles,得出第一步可能拿的石头数(possibles),然后看此时result[count - possibles]是否全为Ture(即上一步后手在可以拿的石头总数的情况下都能赢),此时先手必然输;否则,只要result[count - possibles]中有一个False,则先手
  3. 实际就是 从总数为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

**扩展:**是否能把最优的拿法打印出来?或者创建一个小游戏(手动自己拿和程序每次都按最优的拿法拿)?