抖音的倒水问题, 计算机bfs求解

暴力求解 bfs方法.并且找到的一定是最少步骤

问题:

抖音上面又来了一个倒水游戏

例子: 3个杯子, 容量12, 9, 5 上来12是满的. 然后都没有刻度只能倒到一个满这种倒法, 然后最后希望倒出2个6ml的.

# 抖音上面又来了一个倒水游戏


# 例子: 3个杯子, 容量12, 9, 5 上来12是满的. 然后都没有刻度只能倒到一个满这种倒法, 然后最后希望倒出2个6ml的.


# 这种很类似华容道. 暴力搜一下

#===============这部分需要每次题目给出!!!!!!!!!!!!!
# 维护一下rongliang和开始状态
rongliang=[12,9,5]
kaishi=[12,0,0]
end =[6,6,0] # 




# 显然这是一个马尔科夫过程, 对于kaishi数组进行维护即可.
# 还是使用bfs, 因为这种不会stackoverflow

history=[kaishi]
par=[0] # 指向父指针的索引
lastdex=0
def one_step():
   # 进行一次倒水,遍历所有倒水情况.
   for i in range(lastdex,len(history)):
      tmp=history[i]
      # 尝试新的方式倒水
      for src in range(len(rongliang)):
          for to in range(len(rongliang)):
             src_bottle=tmp[src]
             to_bottle=tmp[to]
             src_cap=rongliang[src]
             to_cap=rongliang[to]
             #=判断是否可以倒水
             if src_bottle!=0 and to_bottle!=to_cap:
                #==========这时候可以倒水.
                daoshuliang=to_cap-to_bottle
                have_shuiliang=src_bottle
                daoshuliang=min(daoshuliang,have_shuiliang)
                # 拼接新的状态
                new_state=tmp.copy()
                new_state[src]-=daoshuliang
                new_state[to]+=daoshuliang
                if new_state not in history:
                  history.append(new_state) # 不用担心死循环. len(history) 到这行时候就赢锁定这个长度了. 用常数替代了.
                  par.append(i)
for i in range(100):
  one_step()
  if end in history:
     dex=history.index(end)
     #========通过par来反解
     lujing=[dex]
     while 0 not in lujing:
        dex=par[dex]
        lujing .append(dex)
     print(f'第{i}次bfs找到了你要的答案,并且算法bfs保证了这个是最少倒水次数')
     print([history[jj] for jj in   lujing[::-1] ])
     break
else:
  print('遍历了100次都找不到你要的答案,可能问题过于复杂或者无解!')

             





















第7次bfs找到了你要的答案,并且算法bfs保证了这个是最少倒水次数
[[12, 0, 0], [7, 0, 5], [7, 5, 0], [2, 5, 5], [2, 9, 1], [11, 0, 1], [11, 1, 0], [6, 1, 5], [6, 6, 0]]
PS C:\Users\admin\Desktop\fucking-algorithm-master>

posted on 2024-04-25 09:21  张博的博客  阅读(35)  评论(0编辑  收藏  举报

导航