Python基於回溯法子集樹模板解決馬踏棋盤問題樣本,python棋盤
本文執行個體講述了Python基於回溯法子集樹模板解決馬踏棋盤問題。分享給大家供大家參考,具體如下:
問題
將馬放到國際象棋的8*8棋盤board上的某個方格中,馬按走棋規則進行移動,走遍棋盤上的64個方格,要求每個方格進入且只進入一次,找出一種可行的方案。
分析
說明:這個圖是5*5的棋盤。
類似於迷宮問題,只不過此問題的解長度固定為64
每到一格,就有[(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1)]順時針8個方向可以選擇。
走到一格稱為走了一步,把每一步看作元素,8個方向看作這一步的狀態空間。
套用回溯法子集樹模板。
代碼
'''馬踏棋盤'''n = 5 # 8太慢了,改為5p = [(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1)] # 狀態空間,8個方向entry = (2,2) # 出發地x = [None]*(n*n) # 一個解,長度固定64,形如[(2,2),(4,3),...]X = [] # 一組解# 衝突檢測def conflict(k): global n,p, x, X # 步子 x[k] 超出邊界 if x[k][0] < 0 or x[k][0] >= n or x[k][1] < 0 or x[k][1] >= n: return True # 步子 x[k] 已經走過 if x[k] in x[:k]: return True return False # 無衝突# 回溯法(遞迴版本)def subsets(k): # 到達第k個元素 global n, p, x, X if k == n*n: # 超出最尾的元素 print(x) #X.append(x[:]) # 儲存(一個解) else: for i in p: # 遍曆元素 x[k-1] 的狀態空間: 8個方向 x[k] = (x[k-1][0] + i[0], x[k-1][1] + i[1]) if not conflict(k): # 剪枝 subsets(k+1)# 測試x[0] = entry # 入口subsets(1) # 開始走第k=1步