天天看點

搜尋(深度優先搜尋和廣度優先搜尋)

搜尋中比較基礎也比較重要的就兩種 廣搜(BFS)和深搜(DFS)

其實搜尋可以了解為一種進階的暴力(周遊所有的點),簡單的說就是從一個點開始搜尋所有可能到達的點

一. 深度優先搜尋

可以分為兩種一種用遞歸一種不用遞歸(不用遞歸的比較麻煩就不給大家講了)

首先遞歸應該都很清楚,不清楚的同學們可以看看下面的這篇文章(講解的很清楚)https://blog.csdn.net/sinat_38052999/article/details/73303111

主要過程

1.先從一個點出發,不斷地走,直到不能走的點或者中點

2.遇到不能走的點時就回到上一個點繼續嘗試其他的點

一個模闆版幫助大家了解:

int dfs(step(步數)和 初始點資訊){
	if(找到解(終止條件) || 無法繼續走下一步(邊界條件)){
		...
		return;
	}
	枚舉下一種情況,dfs(step+1);
} 
//和遞歸比較像
           

一. 廣度優先搜尋

要用到隊列的知識,不知道的同學看這裡 (講解的也是非常清楚)https://blog.csdn.net/lym152898/article/details/52202606

主要過程:

1.将初始點加入隊列。

2.判斷隊列不為空。

3.将于隊首相鄰的點加入隊列,直到找到目标點。

一個模闆供大家了解:

int bfs(){
	先初始化隊列a
	a={起點s};
	标記s;
	while(a非空){
		取a隊首元素u;
		U出隊;
		if(u ==目标狀态){
		.....
		}
		與u相鄰且通路的點進入隊列;
		标記u為已通路;
	}
}
           

繼續閱讀