深度优先搜索(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(队列不为空)
{
    出队队首元素
    对队首元素进行扩展{
        判断扩展的元素能否入队,将能扩展的元素入队并对标记数组进行相应修改
        判断这个扩展点是否满足结束搜索的条件,若满足则直接结束对队列元素的操作并输出结果
    }
}

猜你喜欢

转载自blog.csdn.net/qq_25800311/article/details/83473778