- 最后登录
- 2021-4-20
- 在线时间
- 598 小时
- 阅读权限
- 40
- 注册时间
- 2009-3-5
- 积分
- 1843
- 帖子
- 1468
- 精华
- 1
- UID
- 79281
- 性别
- 男

- 积分
- 1843
- 帖子
- 1468
- 精华
- 1
- UID
- 79281
- 性别
- 男
|
这个问题规模很小,只有27^3=19683。用递归轻松搞定。 调用 s(27, 27, 27, 0) 返回的是 (27, 24, 27),表示第一步在B里取3个,以后根据对手的决策反复调用s就行了。- #!/usr/bin/python3 -i
- def solver(a_max, b_max, c_max):
- mem = {(0, 0, 0, 0): 'win',
- (0, 0, 0, 1): 'lose'}
- def adj(a, b, c):
- return ([(i, b, c) for i in range(max(0, a - a_max), a)] +
- [(a, i, c) for i in range(max(0, b - b_max), b)] +
- [(a, b, i) for i in range(max(0, c - c_max), c)])
- def rec(x):
- if x not in mem:
- p = ((sum(x) + 1) % 2,)
- for y in adj(*x[:3]):
- if rec(y + p) == 'lose':
- mem[x] = y
- break
- else:
- mem[x] = 'lose'
- return mem[x]
- return lambda a, b, c, p: rec((a, b, c, p))
- s = solver(3, 4, 5)
- print(s(27, 27, 27, 0))
复制代码
[ 本帖最后由 yq_118 于 2011-9-11 20:40 编辑 ] |
|