深度優先演算法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 重複...