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

運行結果如下:



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com