抖音的倒水問題, 計算機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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章