DFS(深度优先搜索)
1.什么是DFS
定义:用于遍历或搜索树或图的一种算法。 沿着树的深度遍历树的节点,尽可能更深的搜索树的分支,当节点V的所在边都已经被搜寻过或者在搜索时节点不满足条件,搜索将回溯到发现到节点V的那条边的起始节点整个进程都会反复进行直到所有节点都被访问到为止。
2.DFS的时间复杂度
深度优先搜索的时间复杂度为**O(b ^ m),**其中b是搜索树的最大分支因子,m是状态空间的最大深度。
3.模板
void DFS(参数){
if (终止条件){
做要做的事
return ;//退出 }
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点; DFS(路径,选择列表);
回溯:回到没用过 }
return ;//退出 }
4.举个栗子
给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
AC代码
#include<iostream> using namespace std; const int N = 10; int path[N];//保存序列 int state[N];//数字是否被用过 int n; void dfs(int u) { if(u > n)//数字填完了,输出 { for(int i = 1; i <= n; i++)//输出方案 cout << path[i] << " "; cout << endl; } ``` for(int i = 1; i <= n; i++)//空位上可以选择的数字为:1 ~ n { if(!state[i])//如果数字 i 没有被用过 { path[u] = i;//放入空位 state[i] = 1;//数字被用,修改状态 dfs(u + 1);//填下一个位 state[i] = 0;//回溯,取出 i } } ``` } int main() { cin >> n; dfs(1) }