1. 程式人生 > >深度優先搜尋(DFS)與廣度優先搜尋(BFS)

深度優先搜尋(DFS)與廣度優先搜尋(BFS)

深度優先搜尋的基本模型

void dfs(int step)
{
    判斷邊界
    嘗試每一種可能 for(int i=0; i<n; i++)
    {
        繼續下一步 dfs(step+1);
    }    
    返回
}

輸出一個數組的全排列,如由字串a,b,c所能排列出來的所有字串為abc,acb,bac,cab,cba。

void swap(int &a, int&b) {
	int temp = a;
	a = b;
	b = temp;
}

//把一個數組看成部分,第一部分是它的第一個元素,第二部分是它後面的元素
//求整個陣列的排列,可看成兩步
//第一步求所有可能出現在第一個位置的元素,即把第一個元素與後面的所有元素交換
//第二步固定第一個元素,求第二部分的排列。仍然將其分為兩部分
void print_all_sort(vector<int> &input,int begin, int end) {
	if (begin == end) {
		for (auto a : input) {
			cout << a;
		}
		cout << endl;
	}

	for (int i = begin; i <= end; i++) {
		swap(input[begin], input[i]);
		print_all_sort(input, begin + 1, end);
		swap(input[begin], input[i]);
	}
}

廣度優先搜尋(BFS)

  加入身處一個迷宮之中,在每一個位置下一步能夠走到的地方是由當前位置周圍的迷宮設定情況決定的,廣度優先搜尋就是通過一層一層地擴充套件尋找從起點到達指定目的地的路徑。初始化一個空佇列,將起點入隊。初始化一個標記陣列book,標記哪些點已經在佇列中了,防止一個點被重複擴充套件,並將起點對應的book元素置為true(表示起點已在佇列中),每一個元素只入隊一次,所以元素出隊後不需要再將其對應book元素設為false。

  廣度優先搜尋的過程就是,每一步從佇列中出隊一個元素,以這個元素進行擴充套件,將該元素能夠到達的且book對應元素為false的點入隊,這個元素擴充套件結束後,繼續從佇列中出隊元素,進行下一個元素的擴充套件。這樣重複進行直到到達目的地或者佇列為空則停止,並輸出相應的結果。

while(佇列不為空)
{
    出隊隊首元素
    對隊首元素進行擴充套件{
        判斷擴充套件的元素能否入隊,將能擴充套件的元素入隊並對標記陣列進行相應修改
        判斷這個擴充套件點是否滿足結束搜尋的條件,若滿足則直接結束對佇列元素的操作並輸出結果
    }
}