程式設計與演算法(六) 深度優先搜尋

2021-10-05 03:20:07 字數 2468 閱讀 9523

乾坤未定,你我皆是黑馬

在圖上如何尋找從1到8的路徑

運氣最好:1->2->4->8

運氣稍差:1->2->4->5->6->8

運氣壞:1-3->7->9=>7->a=>7=>3->5->6->8(雙線箭頭表示回退)

不連通的圖,無法從節點1走到節點8

完整的嘗試過程如下:

1->2->4->3->7=>3=>4=>2->9=>2=>1

結論:不存在從1到8的路徑

得出這個結論之前,一定會把從1出發能走到的點全部都走過。

深度優先搜尋(depth-first-search)dfs:

從起點出發,走過的點要做標記,發現有沒走過的點,就隨意挑乙個往前走,走不了就回退。

c++:

int main()

int main()

}cout《有個方格矩陣,矩陣邊界在無窮遠處。有如下假設:

請問:如果允許在方格矩陣上走n步(n<=20),共有多少種不同的方案。

思路:

遞迴:從(i,j)出發,走n步的方案數,等於以下三項之和:

從(i+1,j)出發,走n-1步的方案數。前提:(i+1,j)還沒走過

從(i,j+1)出發,走n-1步的方案數。前提:(i,j+1)還沒走過

從(i,j-1)出發,走n-1步的方案數。前提:(i,j-1)還沒走過

c++:

#include #include using namespace std;

int visited[30][50];

int ways(int i,int j,int n)

int main();

vector< vector< road> > g(110);

int minlen;

int totallen;

int totalcost;

int visited[110];

void dfs(int s)

for(int i=0;ik)

continue;

if (!visited[r.d])

}}int main()

}memset(visited,0,sizeof(visited));

totallen=0;

minlen=1<<30; //乙個非常大的數

totalcost=0;

visited[1]=1; //走過第乙個點了

dfs(1);

if (minlen<(1<<30));

vector< vector< road> > g(110);

int minlen;

int totallen;

int totalcost;

int visited[110];

void dfs(int s)

for(int i=0;ik)

continue;

if (!visited[r.d])

}}int main()

}memset(visited,0,sizeof(visited));

totallen=0;

minlen=1<<30; //乙個非常大的數

totalcost=0;

visited[1]=1; //走過第乙個點了

dfs(1);

if (minlen<(1<<30));

vector< vector< road> > g(110);

int minlen;

int totallen;

int totalcost;

int visited[110];

int minl[110][10010];

void dfs(int s)

for(int i=0;ik)

continue;

if (!visited[r.d])

}}int main()

}memset(visited,0,sizeof(visited));

totallen=0;

minlen=1<<30; //乙個非常大的數

totalcost=0;

visited[1]=1; //走過第乙個點了

for (int i=0;i<110;i++)

for (int j=0;j<10010;j++)

minl[i][j]=1<<30;

dfs(1);

if (minlen<(1<<30))

}if (v<=0)

return;

//列舉第n層的高度和半徑,第n層的半徑和高度至少是n;

for( int rr=r;rr>=n;--rr)

dfs(int n,m,maxr,maxh);

if (minarea==1<<30)

cout<<0

cout

}

深度優先搜尋演算法程式設計模板

深度優先搜尋適合解決必須走到最深處 例如對於樹,須走到它的葉子節點 才能得到乙個解的問題。通常利用遞迴實現,所以每次遞迴開始的時候要判斷是否達到收斂條件,若達到了則得到乙個可行解,若沒達到,則對當前狀態進行擴充套件 擴充套件的時候通常會根據實際情況過濾掉一些非法的狀態,這個過程叫剪枝,適當的剪枝有時...

深度優先與廣度優先搜尋演算法

1.深度優先搜尋演算法 depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次.深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷 直至圖中和v有路徑相通的頂點都被訪...

演算法設計與分析 廣度優先搜尋 深度優先搜尋

三 實驗環境 四 實驗過程 五 實驗結果 六 實驗總結 實驗 github bfs核心思想 解讀偽碼 vertex vertex node nextnode int vertexid 頂點的唯一識別符號 vertex nextvertex 把所有頂點放在乙個鍊錶中,這個指標指向它的下乙個頂點 nod...