指定的起始點和終點,確定好當前點與鄰接點之間的偏移值、結束搜尋的條件、符合訪問的點所需條件、回溯處理
1、若當前點的鄰接點有未被訪問的,則選乙個進行訪問;
2、若當前點的鄰接點都不符合訪問條件,退回到當前點的上乙個點;
3、直到訪問到目標終點,或是所有點均以訪問仍無法到達終點;
dfs可以通過遞迴函式、棧(先入後出的儲存結構)來實現
前段時間正好幫同學敲乙個迷宮的講解,針對具體題目h是牆,o是路。。。
**由c++編寫
1 #include 2 #include 3 #include等待更新。。。4 #include 5 #include 6
using
namespace
std;
78 typedef struct
point;
11void
out(int a[100][100], int m, int n)18}
1920
intmain(); //
走迷宮的過程中上下方向的偏移值
32int d2[4] = ; //
走迷宮的過程中左右方向的偏移值
3334 cout << "
請輸入第
"<< z+1
<< "
個迷宮的行列:
"<
35 cin >> m >>n;
3637 cout << "
請輸入第
"<< z+1
<< "
個迷宮:
"<
38for(i = 0; i < m; i++)
46 }//
out(map, m, n);
//檢視迷宮地圖
4748 cout << "
請輸入起點座標和終點座標:
"<
49 cin >> start.x >> start.y >> end.x >>end.y;
5051 start.step = 1
;52 map[start.x][start.y] = -1; //
將起始點在地圖上標記出來
53s.push(start);
54while(!s.empty())72}
73if(i == 4) //
當i為4的時候,就是四周都不能走
74s.pop();75}
76if(s.empty())//
out(map, m, n);
//檢視迷宮地圖行走情況
8081 i = 0
;82 point *road = new point[m*n]; //
用於輸出走出迷宮的路徑
83while(!s.empty())
89 cout << "
走出迷宮共用了
"<< i << "
步,經過的點為:";
90for(i = 1; i < j; i++)
91 cout << road[i].x << ","
<< road[i].y << "
->";
92 cout << road[i].x << ","
<< road[i].y <
94 cout << "
請輸入需要走幾個迷宮:
"<
96return0;
97}
深度優先搜尋DFS
作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...
深度優先搜尋 DFS
深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...
深度優先搜尋(dfs)
深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...