暴力求解 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>