深度優先搜尋

2021-10-02 16:38:24 字數 2059 閱讀 2041

深搜是一種不撞南牆不回頭的演算法,即是有序的嘗試每一種可能的情況。

用到的知識:遞迴

先來看乙個全排列的例子。

例1.輸出1~n的全排列並計算排列總和。

很明顯,暴力列舉也可以做,但時間複雜度肯定過高,深搜可以解決這種問題。

我們假設有九個格仔,手上有九張撲克牌,因此我們需要兩個全域性陣列變數來記錄格仔裡的數和手上還剩什麼牌,還需要兩個全域性變數儲存n和排列總數。

int a[10]

,book[10]

;int n,t=

0;

給a陣列裡存值很簡單,乙個迴圈即可

int i;

for(i=

1;i<=n;i++

)}

接下來需要用到遞迴,我們建立乙個函式

void

dfs(

int step)

//step記錄當前所在格仔位置

}return

;//結束遞迴

}

接下來判斷當前位置是否走完所有格仔

int i;

//此段**在函式裡面包含

if(step==n+1)

函式**

void

dfs(

int step)

for(i=

1;i<=n;i++)}

return

;}

接下來主函式只需要輸入n及將step記錄在第乙個格仔即可

int

main()

完整**

#include

int a[10]

,b[10

],t=

0,n;

void

dfs(

int step)

for(i=

1;i<=n;i++)}

return;}

intmain()

例2.輸入地圖行和列,並用1記錄障礙物,用0記錄空地,輸入一張地圖及初始座標和最終座標,計算初始座標到最終座標的最少步數。

這個題顯然要用到二維陣列,我們建立兩個全域性陣列變數記錄地圖和走過的座標,還要五個變數記錄行列、最終座標及最小值

int a[10]

[10],b[10]

[10];

int n,m,p,q,min=

99999

;

遞迴函式: //基本思想與上題沒有太大出入

void

dfs(

int x,

int y,

int step)

//x,y:當前座標 ,step:當前步數

int tx,ty,k;

//tx,ty:下一步座標

int next[4]

[2]=

,,,}

;//此陣列用來記錄下一步可能走法

for(k=

0;k<=

3;k++)}

return

;}

主函式**

int

main()

完整**

#include

int a[10]

[10],b[10]

[10];

int n,m,p,q,min=

99999

;void

dfs(

int x,

int y,

int step)

int tx,ty,k;

int next[4]

[2]=

,,,}

;for

(k=0

;k<=

3;k++)}

return;}

intmain()

以上

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...

廣度優先搜尋,深度優先搜尋

深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...

深度優先搜尋 廣度優先搜尋

深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 package com.neusoft.data.structure 深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 public class dfsbfs 初始化 邊 mmatrix new int vlen vlen for...