题目描述
有三个容量分别为 A,B,C 升的挤奶桶。最开始桶 A 和桶 B 都是空的,桶 C 里装满了牛奶。
约翰会将牛奶从一个桶倒到另一个桶中,直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。
这一过程中间不能有任何停顿,并且不会有任何牛奶的浪费。
请你编写一个程序判断,当 A 桶是空的时候,C 桶中可能包含多少升牛奶,找出所有的可能情况。
输入格式
共一行,包含三个整数 A,B,C。
输出格式
共一行,包含若干个整数,表示 C 桶中牛奶存量的所有可能情况,请将这些数字按升序排列。
va, vb, vc = map(int, input().split())
vis = [[[0] * 25 for _ in range(25)] for _ in range(25)]
# 用vis记录遍历情况,通过穷举每个桶倒入其它桶情况,得到A为0的情况中C的情况
def dfs(a, b, c):
if vis[a][b][c] != 0: return
vis[a][b][c] = 1 # 表示这种情况找到过
# a -> b,只有倒满和倒空两种情况
if vb - b > a: dfs(0, b + a, c) # a倒空
if vb - b <= a: dfs(a - (vb - b), vb, c) # b倒满
# a -> c,同理
if vc - c > a: dfs(0, b, c + a) # a空
if vc - c <= a: dfs(a - (vc - c), b, vc) # c满
# b->c
if vc - c > b: # b空
dfs(a, 0, c + b)
else: # c满
dfs(a, b - (vc - c), vc)
# b-> a
if va - a > b:
dfs(a + b, 0, c)
else:
dfs(va, b - (va - a), c)
# c->a
if va - a > c:
dfs(a + c, b, 0)
else:
dfs(va, b, c - (va - a))
# c->b
if vb - b > c: dfs(a, b + c, 0);
if vb - b <= c: dfs(a, vb, c - (vb - b))
dfs(0, 0, vc) # 初始情况
for i in range(vc + 1):
for j in range(vb + 1):
if vis[0][j][i]: # A空
print(i, end=' ')