傳教士與食人者問題python
g = {} # 存放父子節點
statusl = []# 表示方式 [ML, CL, MR, CR, B] 左傳教士、左野人、右傳教士、右野人、船
route = [] # 一次路徑
way = [] # 總路徑
actions = [[1, 0], [0, 1], [1, 1], [0, 2], [2, 0]] # 五種操作方式
def result(s):
if s[0] < 0 or s[1] < 0 or s[2] < 0 or s[3] < 0: # 負數
return
if (s[0] < s[1] and s[0] != 0) or (s[2] < s[3] and s[2] != 0): # 傳教士被吃
return
d = tuple(s) # 元組作為狀態點
if len(statusl) > 1:
f = tuple(statusl[-2][:])
if f in g.keys() and d not in g[f]:
g[f].append(d)
else:
g[f] = [d]
for k in statusl[:-1]: # 重複狀態
if k[0] == s[0] and k[1] == s[1] and k[3] == s[3] and k[4] == s[4]:
return
mid = [0] * 5
for j in actions:
mid[0] = s[0] - j[0] * s[4]
mid[1] = s[1] - j[1] * s[4]
mid[2] = s[2] + j[0] * s[4]
mid[3] = s[3] + j[1] * s[4]
mid[4] = -s[4]
statusl.append(mid[:])
result(mid) # 判斷該動作是否合理,並加入字典
statusl.pop()
return
# 深度搜尋尋找路徑
def dfs(s):
s = tuple(s) # 字典的值是列表裡面包含元組,原因是字典的鍵值不能是列表
if s in route: # 已經在路徑裡面
route.append(s)
return
# 到達終點,記錄路徑
if s == (0, 0, 3, 3, -1):
route.append(s)
way.append(route[:])
return
route.append(s)
for i in range(len(g[s])):
dfs(g[s][i]) # 遞迴搜尋直到到達終點或者重複
route.pop()
def main():
start = [3, 3, 0, 0, 1]
statusl.append(start)
result(start)
dfs(start)
num = 0 # 統計次數
# 輸出路徑
for k in way:
num += 1
print(" 外匯跟單gendan5.com 第 %d 條路徑: " % num)
print(" 左傳教士 , 左食人者 , 右傳教士 , 右食人者 , 船 ")
for i in k:
print("{} {} {} {} {} ".format(i[0], i[1], i[2], i[3], i[4]))
print(" 總共有 %d 條路徑 " % num)
if __name__ == '__main__':
main()
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2769585/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python中傳值和傳地址問題Python
- Python中的生產者消費者問題Python
- linux 生產者與消費者問題Linux
- python中多程式消費者生產者問題Python
- 面試必問:訊號量與生產者消費者問題!面試
- Ajax與Flask傳值的跨域問題Flask跨域
- 【C++】人工智慧實驗一之猴子摘香蕉/傳教士與野人(含完整程式碼與狀態遷移圖)C++人工智慧
- Python與Django的時區問題PythonDjango
- 18、Python與設計模式–訪問者模式Python設計模式
- 遺傳演算法求解TSP問題(python版)演算法Python
- Python-單繼承中值傳遞的問題Python繼承
- python中多執行緒消費者生產者問題Python執行緒
- 不同使用者python path 許可權問題Python
- 區塊鏈遊戲與傳統遊戲潛力與問題並存區塊鏈遊戲
- Python程式設計常見問題與解答Python程式設計
- Python 疑難問題:[] 與 list() 哪個快?Python
- 詳說TCP重傳問題的排查思路與實踐TCP
- python 3.6.2 安裝與執行 Scrapy 問題與解決Python
- socet簡訊傳送與執行緒設計的問題執行緒
- Python | 淺談併發鎖與死鎖問題Python
- python-訪問者模式Python模式
- 請問 javamail 傳送程式編譯問題JavaAI編譯
- Python編解碼問題與文字檔案處理Python
- Python工程師必看的面試問題與解答(中)Python工程師面試
- Python實現make_bricks與make_chocolate問題Python
- python訪問redis的問題PythonRedis
- [文件教程]解決sae下文件縮圖上傳問題及外掛上傳問題
- go os.FileMode()傳值問題Go
- wangEditor上傳圖片問題
- vue元件(component)傳值問題Vue元件
- 阿里雲OOS上傳問題阿里
- 上傳App Store遇到的問題APP
- 傳送郵件出現問題
- 上傳檔案超時問題
- socket網路傳輸的問題
- gitlab上傳問題記錄Gitlab
- Python學習者可能存在的幾個問題,你遇到過嗎?Python
- java經典問題:傳值還是傳引用(轉)Java