基于Python的三个油瓶分油问题求解通解

假设有三个瓶子,三个瓶子体积分别为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

          通过上述四种用例,写出操作最优解,再根绝最优解找到操作规律。

基于Python的三个油瓶分油问题求解通解_第1张图片   基于Python的三个油瓶分油问题求解通解_第2张图片   基于Python的三个油瓶分油问题求解通解_第3张图片

最后的得出结论:

        核心操作为以下三步:(A->B表示A瓶倒入B瓶,直至A瓶倒空或者B瓶倒满)

                A->B        B->C        C->A

        流程图如下:

        定义:  V_A,V_b,V_C分别为三个瓶子的最大体积

                  V_a,V_b,V_c分别为三个瓶子实时的体积

       

基于Python的三个油瓶分油问题求解通解_第4张图片

完整代码实现

"""
	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))

你可能感兴趣的:(python,pycharm)