DFS 深度優先搜尋(Python)

2021-10-09 10:02:51 字數 2413 閱讀 7371

深度優先演算法dfs訪問頂點v;

依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;

若此時圖中尚有頂點未被訪問,則從乙個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。

下面,我將用圖來展示bfs演算法的工作過程:

以下是迷宮的dfs演算法實現:

# -*- coding: utf-8 -*-

"""created on tue oct 2 20:28:21 2018

@author: duxiaoqin

functions:

(1)dfs for maze;

"""from graphics import

*from myarray2d import array2d

from maze import maze

from mazedraw import mazedraw

defdfs

(maze, v, goal, came_from)

:if came_from ==

: came_from[v]

=none

if v == goal:

return v

maze[v[0]

, v[1]

]= maze.occupied

for w in maze.getallmoves(v[0]

, v[1]

):if maze[w[0]

, w[1]

]== maze.empty:

came_from[w]

= v result = dfs(maze, w, goal, came_from)

if result == goal:

return result

return

none

defdrawpath

(win, maze, came_from)

: current = maze.goal

while current != maze.start:

next

= came_from[current]

line = line(point(

next[1

]+1+

0.5, \

maze.numrows()-

next[0

]+1-

0.5)

, \ point(current[1]

+1+0.5

, \ maze.numrows(

)-current[0]

+1-0.5))

line.setoutline(

'white'

) line.setarrow(

'last'

) line.draw(win)

current =

next

defmain()

: win = graphwin(

'dfs for maze'

,600

,600

, autoflush=

false

) maze = maze(20,

20)mazedraw = mazedraw(win, maze)

mazedraw.draw(

)#visited = array2d(maze.numrows(), maze.numcols())

#visited.clear(false)

came_from =

found = dfs(maze, maze.start, maze.goal, came_from)

text = text(point(11,

0.5),''

)if found == maze.goal:

text.settext(

'goal found!'

) drawpath(win, maze, came_from)

else

: text.settext(

'goal not found!'

) text.draw(win)

while win.checkkey()!=

'escape'

:pass

win.close(

)if __name__ ==

'__main__'

: main(

)

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...