Python解決走迷宮問(wèn)題算法示例
本文實(shí)例講述了Python解決走迷宮問(wèn)題算法。分享給大家供大家參考,具體如下:
問(wèn)題:
輸入n * m 的二維數(shù)組 表示一個(gè)迷宮
數(shù)字0表示障礙 1表示能通行
移動(dòng)到相鄰單元格用1步
思路:
深度優(yōu)先遍歷,到達(dá)每一個(gè)點(diǎn),記錄從起點(diǎn)到達(dá)每一個(gè)點(diǎn)的最短步數(shù)
初始化案例:
1 1 0 1 1
1 0 1 1 1
1 0 1 0 0
1 0 1 1 1
1 1 1 0 1
1 1 1 1 1
1 把圖周?chē)由弦蝗?1 , 在深度優(yōu)先遍歷的時(shí)候防止出界
2 把所有障礙改成-1,把能走的地方改成0
3 每次遍歷經(jīng)歷某個(gè)點(diǎn)的時(shí)候,如果當(dāng)前節(jié)點(diǎn)值是0 把花費(fèi)的步數(shù)存到節(jié)點(diǎn)里
如果當(dāng)前節(jié)點(diǎn)值是-1 代表是障礙 不遍歷它
如果走到當(dāng)前節(jié)點(diǎn)花費(fèi)的步數(shù)比里面存的小,就修改它
修改后的圖:
-1 -1 -1 -1 -1 -1 -1
-1 0 0 -1 0 0 -1
-1 0 -1 0 0 0 -1
-1 0 -1 0 -1 -1 -1
-1 0 -1 0 0 0 -1
-1 0 0 0 -1 0 -1
-1 0 0 0 0 0 -1
-1 -1 -1 -1 -1 -1 -1
外周的-1 是遍歷的時(shí)候防止出界的
默認(rèn)從左上角的點(diǎn)是入口 右上角的點(diǎn)是出口
Python代碼:
# -*- coding:utf-8 -*- def init(): global graph graph.append([-1, -1, -1, -1, -1, -1, -1]) graph.append([-1, 0, 0, -1, 0, 0, -1]) graph.append([-1, 0, -1, 0, 0, 0, -1]) graph.append([-1, 0, -1, 0, -1, -1, -1]) graph.append([-1, 0, -1, 0, 0, 0, -1]) graph.append([-1, 0, 0, 0, -1, 0, -1]) graph.append([-1, 0, 0, 0, 0, 0, -1]) graph.append([-1, -1, -1, -1, -1, -1, -1]) #深度優(yōu)先遍歷 def deepFirstSearch( steps , x, y ): global graph current_step = steps + 1 print(x, y, current_step ) graph[x][y] = current_step next_step = current_step + 1 ''' 遍歷周?chē)?個(gè)點(diǎn): 如果周?chē)?jié)點(diǎn)不是-1 說(shuō)明 不是障礙 在此基礎(chǔ)上: 里面是0 說(shuō)明沒(méi)遍歷過(guò) 我們把它修改成當(dāng)前所在位置步數(shù)加1 里面比當(dāng)前的next_step大 說(shuō)明不是最優(yōu)方案 就修改它 里面比當(dāng)前next_step說(shuō)明當(dāng)前不是最優(yōu)方案,不修改 ''' if not(x-1== 1 and y==1) and graph[x-1][y] != -1 and ( graph[x-1][y]>next_step or graph[x-1][y] ==0 ) : #左 deepFirstSearch(current_step, x-1 , y ) if not(x == 1 and y-1==1) and graph[x][y-1] != -1 and ( graph[x][y-1]>next_step or graph[x][y-1] ==0 ) : #上 deepFirstSearch(current_step, x , y-1 ) if not(x == 1 and y+1==1) and graph[x][y+1] != -1 and ( graph[x][y+1]>next_step or graph[x][y+1]==0 ) : #下 deepFirstSearch(current_step, x , y+1 ) if not(x+1== 1 and y==1) and graph[x+1][y] != -1 and ( graph[x+1][y]>next_step or graph[x+1][y]==0 ) : #右 deepFirstSearch(current_step, x+1 , y ) if __name__ == "__main__": graph = [] init() deepFirstSearch(-1,1,1) print(graph[1][5])
運(yùn)行結(jié)果:
(1, 1, 0)
(1, 2, 1)
(2, 1, 1)
(3, 1, 2)
(4, 1, 3)
(5, 1, 4)
(5, 2, 5)
(5, 3, 6)
(4, 3, 7)
(3, 3, 8)
(2, 3, 9)
(2, 4, 10)
(1, 4, 11)
(1, 5, 12)
(2, 5, 13)
(2, 5, 11)
(4, 4, 8)
(4, 5, 9)
(5, 5, 10)
(6, 5, 11)
(6, 4, 12)
(6, 3, 13)
(6, 2, 14)
(6, 1, 15)
(6, 3, 7)
(6, 2, 8)
(6, 1, 9)
(6, 4, 8)
(6, 5, 9)
(6, 2, 6)
(6, 1, 7)
(6, 1, 5)
12
PS:本站還有一個(gè)無(wú)限迷宮游戲,基于JS實(shí)現(xiàn),提供給大家參考一下:
在線迷宮小游戲:
http://tools.jb51.net/games/migong
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python?functools凍結(jié)參數(shù)小技巧實(shí)現(xiàn)代碼簡(jiǎn)潔優(yōu)化
這篇文章主要為大家介紹了Python?functools凍結(jié)參數(shù)小技巧實(shí)現(xiàn)代碼簡(jiǎn)潔優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Python2.5/2.6實(shí)用教程 入門(mén)基礎(chǔ)篇
本文方便有經(jīng)驗(yàn)的程序員進(jìn)入Python世界.本文適用于python2.5/2.6版本.2009-11-11Python input函數(shù)實(shí)現(xiàn)獲取鍵盤(pán)輸入的字符串流程講解
這篇文章主要介紹了Python input函數(shù)實(shí)現(xiàn)獲取鍵盤(pán)輸入的字符串流程,input()是Python的內(nèi)置函數(shù),用于從控制臺(tái)讀取用戶輸入的內(nèi)容。input()函數(shù)總是以字符串的形式來(lái)處理用戶輸入的內(nèi)容,所以用戶輸入的內(nèi)容可以包含任何字符2023-01-01如何利用Python寫(xiě)個(gè)坦克大戰(zhàn)
這篇文章主要給大家介紹了關(guān)于如何利用Python寫(xiě)個(gè)坦克大戰(zhàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11構(gòu)建高效的python requests長(zhǎng)連接池詳解
這篇文章主要介紹了構(gòu)建高效的python requests長(zhǎng)連接池詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python新手必讀bytearray對(duì)象使用技巧掌握
Python中的bytearray是一個(gè)可變序列,通常用于存儲(chǔ)二進(jìn)制數(shù)據(jù),它允許在不創(chuàng)建新的對(duì)象的情況下就地修改數(shù)據(jù),非常適用于處理字節(jié)數(shù)據(jù),本文將深入學(xué)習(xí)bytearray對(duì)象的使用,包括創(chuàng)建、修改、切片和常見(jiàn)應(yīng)用場(chǎng)景2023-12-12python中dtypes和type()函數(shù)的區(qū)別示例詳解
type()是python內(nèi)置的函數(shù),type()返回?cái)?shù)據(jù)結(jié)構(gòu)類(lèi)型(list、dict、numpy.ndarray 等),dtype返回?cái)?shù)據(jù)元素的數(shù)據(jù)類(lèi)型(int、float等),這篇文章主要給大家介紹了關(guān)于python中dtypes和type()函數(shù)區(qū)別的相關(guān)資料,需要的朋友可以參考下2024-03-03