2016.3.31 蘑菇街笔试编程题2

有4个瓶子,其容积分别为 10 ,6,5,4

初始状态为 10,0,0,0

现给出一个目标状态obj,问最少经过几部可以到达目标状态。

(注:每次倒水只能将自己倒空或将别杯倒满!)

############################################ 4个瓶子倒水问题BFS 2016.4.4
# 由一个状态list s可以到达的下一个状态的集合
def changeto(s,vvv):
    res = []
    for i in range(4):
        for j in range(4):
            if i==j or s[i]==0: # 自己不会向自己倒水,自己为0的时候也无法给别人倒水
                continue
            tmp = list(s)
            if s[i]+s[j]<vvv[j]: # j装的下时,全部给j
                tmp[i] = 0
                tmp[j] = s[i]+s[j]
            else: # j装不下时,把j装满,自己留剩下的
                tmp[i] = s[i]+s[j]-vvv[j]
                tmp[j] = vvv[j]
            res.append(tmp)
##    print "res:",res
    return res

## 进行BFS搜索,使用辅助数据结构队列q        
def bfs( obj ):
    vvv = [10,6,5,4] # 4个杯子中水的容量
    start = [10,0,0,0] # 起始状态
    q = [start] # 初始队列q
    rounds = 0 # 倒水的次数
    table = set([]) # 已经过的状态的集合

    while q:
        if obj in q: # 找到了obj状态,则成功!
            print rounds
            return
        
        rounds += 1 
        size = len(q)
        for i in range(size):
            curs = q.pop() # 当前状态curs
            if tuple(curs) in table: # 在集合中,则跳过
                continue
            table.add(tuple(curs)) # 否则加入集合
            q.extend( changeto(curs, vvv) )# 将fq状态的下一个状态集合加入q        
    print -1
    
while 1:
    try:
        obj = [int(x) for x in raw_input().split()]
    except:
        break
    bfs(obj)

如果无法到达目标状态,则标记为-1

运行结果如下:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值