##棋盤長寬 X = 15 Y = 15 ##相對與初始位置馬能夠選擇走的步數 STEP = 8 ##馬能夠選擇走的方式 nextList = [(2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (1, -2)] ##出發點 startPoint=(0,0) chess=[[0 for j in range(Y)] for i in range(X)] print(chess) ##判斷下一步是否可走 def nextOk(point, i): nextp = (point[0] + nextList[i][0], point[1] + nextList[i][1])#獲取偏移後坐標 if 0 <= nextp[0] < X and 0 <= nextp[1] < Y and chess[nextp[0]][nextp[1]] == 0:#判斷落子是否在棋盤內,而且未被走過 return True, nextp else: return False, point ##得到下一步可走列表 def findNext(point): list = [] for i in range(STEP): ok, pointn = nextOk(point, i) #(2,0),0-7 把能走的座標都放入列表中返回 if ok: list.append(pointn) return list ##得到步數最少的下一步(貪婪算法) def getBestNext(point, step): #(2,0),2 # temp =X+1 temp =8 best = (-1, -1) list = findNext(point) lenp = len(list) for i in range(lenp): n = len(findNext(list[i]))#在第二步的基礎上,找第三步座標可能性的列表長度 if n < temp: if n > 0: temp = n best = list[i] #挑步數最少的做爲第二步座標 elif n == 0 and step == X * Y: best = list[i] return best ##迭代方式 貪婪算法 def traverseFast(point, step): #(2,0),1 chess[point[0]][point[1]] = step #chess=[[0,0,0],[0,0,0],[1,0,0] while 1: step += 1 best = getBestNext(point, step) if best[0] == -1: return step else: chess[best[0]][best[1]] = step #把第二步座標處改成2 point = best #起始座標改成第二步座標 def testFast(): step = traverseFast(startPoint, 1) #(2,0) 1 if step - 1 == X * Y: print('快速遍歷成功') else: print('快速遍歷失敗') if __name__ == '__main__': testFast() ''' 總結: 1.初始化棋盤:二維X*Y 2.八種相對初始座標的偏移 3,初始位置的選定 4.找到指定第一步位置,將0改成1 5,用一個死循環,第二步判斷哪些位置可走,獲取偏移後坐標,判斷落子是否在棋盤內,而且未被走過,8種方式,將其第二步座標添加到列表之中, 再從第二步列表中座標做爲初始座標,再走8種偏移獲取第三步座標列表,從中挑取列表長度最短的做爲第二步座標 6.若是列表長度爲0說明,馬的位置已經所有走完,能夠比較其步數是否等於x*y,若是列表長度不爲0能夠繼續迭代 '''