杯子倒水问题 -python

题目:假设有两个杯子A ,B,用户只需要输入两个杯子的容量值和需要获取的杯子数值left_c。问两个杯子通过何种操作能获取到left_c 的数值。

分析:此题目是求解优化的问题。采用bfs算法.

class State:
     def __init__(self,a,b,prev,step,operation):
          self.a=a
          self.b=b
          self.prev=prev
          self.step=step
          self.operation=operation
visited=[[False for i in range(100)]for j in range(100)]
def bfs(capativy_a,capativy_b,left_c):
    queue=[]
    s=State(a=0,b=0,prev=None,step=0,operation=None)
    queue.append(s)
    visited[0][0]=True
    while queue:
         state=queue.pop(0)
         for i in range(6):
             a ,b ,operation =None,None,None
             if i==0:
                  operation =" 将杯子A的水倒空"
                  a=0
                  b=state.b
             elif i==1:
                  operation = " 将杯子B的水倒空"
                  a=state.a
                  b=0
             elif i==2:
                  operation = " 将杯子A的水倒满"
                  a=capativy_a
                  b=state.b
             elif i==3:
                  operation = " 将杯子B的水倒满"
                  b=capativy_b
                  a=state.a
             elif i==4:
                   #将杯子A的水倒入杯子B中
                   if capativy_b-state.b>state.a:
                          operation="将杯子A的水倒入杯子B,直至杯子A被倒空"
                          a=0
                          b=state.a+state.b
                   else :
                          operation="将杯子A的水倒入杯子B,直至杯子B被倒满"
                          b=capativy_b
                          a=state.a-(capativy_b-state.b)
             elif i==5:
                   #将杯子B的水倒入杯子A中
                   if capativy_a-state.a>state.b:
                           operation=" 杯子B中的水倒入杯子A中,直至杯子B被倒空"
                           b=0
                           a=state.a+state.b
                   else:
                         operation="杯子B中的水倒入杯子A中,直至杯子A被倒满"
                         a=capativy_a
                         b=state.b-(capativy_a-state.a)
             if  not visited[a][b]:
                   new_state=State(a=a,b=b,prev=state,step=state.step+1,operation=operation)
                   visited[a][b]=True
                   queue.append(new_state)
                   if left_c==a or left_c==b:
                        print("yes")
                        return new_state
    return None

def get_path(state):
     path=[]
     while state.prev:
           path.append(state.operation)
           state  = state.prev
     return path[::-1]

def main():
    capativy_a= int(input("please input the  A:"))
    capativy_b= int(input("pleasr input the  B:"))
    left_c    = int(input("please input the left_c"))
    result    = bfs(capativy_a,capativy_b,left_c)
    if not  result:
       print("error")
    else :
        p=get_path(result)
        print(p)
main()






 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值