栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

假设有三个瓶子,三个瓶子体积分别为V_A,V_B,V_C

三个瓶子的体积满足条件:

1、V_A>V_B>V_C

2、V_A=V_B+V_C

排除无解组合:

1、V_A、V_B、V_C成等差数列,组合无解

2、V_A为奇数,组合无解

3、V_A、V_B、V_C存在最大公约数,化简之后,V_A为奇数,组合无解

4、V_B=V_C,组合无意义

思路产生:
测试用例
组号V_AV_BV_C

1

853
21697
318117

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

    

最后的得出结论:

        核心操作为以下三步:(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("=" * 60)
print("运行说明")
print("1、因为V1=V2+V3,所以只输入V2和V3即可")
print("2、当输入的V2小于V3时,将把体积大的作为V2")
print("3、当V1、V2、V3成等差数列时,组合无解,程序自动终止")
print("4、当V2+V3为奇数时,组合无解,程序自动终止")
print("5、当V1和V2有公约数,约分之后的和为奇数时,组合无解,程序自动终止")
print("=" * 60)

#求最大公约数
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


V_B = int(input("请输入第二个油瓶的体积:"))
V_C = int(input("请输入第三个油瓶的体积:"))

V_A:int = V_B + V_C
simple = simplify(V_B, V_C)
A:int=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->Bt{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->Ct{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->Ct{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->At{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->Ct{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->Ct{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->At{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->Ct{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->Ct{1}t{2}t{3}'.format(step, V_a, V_b, V_c))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917872.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号