假设有三个瓶子,三个瓶子体积分别为V_A,V_B,V_C
三个瓶子的体积满足条件:
1、V_A>V_B>V_C
2、V_A=V_B+V_C
排除无解组合:
1、V_A为奇数,组合无解
2、V_A、V_B、V_C存在最大公约数,化简之后,V_A为奇数,组合无解
3、V_B=V_C,组合无意义
组号 | V_A | V_B | V_C |
---|---|---|---|
1 |
8 | 5 | 3 |
2 | 16 | 9 | 7 |
3 | 18 | 11 | 7 |
通过上述四种用例,写出操作最优解,再根绝最优解找到操作规律。
最后的得出结论:
核心操作为以下三步:(A->B表示A瓶倒入B瓶,直至A瓶倒空或者B瓶倒满)
A->B B->C C->A
流程图如下:
定义: V_A,V_b,V_C分别为三个瓶子的最大体积
V_a,V_b,V_c分别为三个瓶子实时的体积
完整代码实现
"""
File:分油问题.py
Time::2022/5/17 16:12
Author:Lx柒月
version:python 3.7
"""
print("=" * 65)
print("运行说明")
print("1、因为V1=V2+V3,所以只输入V2和V3即可")
print("2、当输入的V2小于V3时,将把体积大的作为V2")
print("3、当V2+V3为奇数时,组合无解,程序自动终止")
print("4、当V1和V2有公约数,约分之后的和为奇数时,组合无解,程序自动终止")
print("=" * 65)
# 求最大公约数
def simplify(A, B):
for i in range(1, B):
x = A % (B - i + 1)
y = B % (B - i + 1)
if x == 0 and y == 0:
return B - i + 1
return 1
try:
V_B = int(input("请输入第二个油瓶的体积:"))
V_C = int(input("请输入第三个油瓶的体积:"))
except Exception as e:
print(e)
exit(1)
V_A = V_B + V_C
simple = simplify(V_B, V_C)
A = V_A / simple
# 去除无解组合
if V_B == V_C:
print("此组合无意义!!!")
exit()
elif V_B == V_C * 2:
print("此组合无解!!!")
exit()
elif V_A % 2 != 0 or A % 2 != 0:
print("此组合无解!!!")
exit()
elif V_B < V_C:
temp = V_B
V_B = V_C
V_C = temp
# 定义初始状态下ABC三个瓶子的值
V_a = V_A
V_b = 0
V_c = 0
step = 0 # 定义步骤数
# 主程序
while V_c < V_C:
# 第一步 A->B
V_a = V_a - V_B + V_b
V_b = V_B
step += 1
print('{0}\tA->B\t{1}\t{2}\t{3}'.format(step, V_a, V_b, V_c))
# 第二步 B->C
if V_b > V_C - V_c:
V_b = V_b - V_C + V_c
V_c = V_C
step += 1
print('{0}\tB->C\t{1}\t{2}\t{3}'.format(step, V_a, V_b, V_c))
else:
V_c += V_b
V_b = 0
step += 1
print('{0}\tB->C\t{1}\t{2}\t{3}'.format(step, V_a, V_b, V_c))
# 第三步 C->A
V_a += V_c
V_c = 0
step += 1
print('{0}\tC->A\t{1}\t{2}\t{3}'.format(step, V_a, V_b, V_c))
if V_a == V_A / 2:
exit()
# 第四步 B->C
if V_b > V_C - V_c:
V_b = V_b - V_C + V_c
V_c = V_C
step += 1
print('{0}\tB->C\t{1}\t{2}\t{3}'.format(step, V_a, V_b, V_c))
else:
V_c += V_b
V_b = 0
step += 1
print('{0}\tB->C\t{1}\t{2}\t{3}'.format(step, V_a, V_b, V_c))
# 再次判断
while V_c == V_C:
# C->A
V_a += V_c
V_c = 0
step += 1
print('{0}\tC->A\t{1}\t{2}\t{3}'.format(step, V_a, V_b, V_c))
if V_a == V_A / 2:
exit()
# B->C
if V_b > V_C - V_c:
V_b = V_b - V_C + V_c
V_c = V_C
step += 1
print('{0}\tB->C\t{1}\t{2}\t{3}'.format(step, V_a, V_b, V_c))
else:
V_c += V_b
V_b = 0
step += 1
print('{0}\tB->C\t{1}\t{2}\t{3}'.format(step, V_a, V_b, V_c))