1.dfs为深度搜索算法
可以在脑海中想像一颗树, 从根节点开始选择左子节点或右子节点向下并且标记,直到到达叶子结点。 回溯到上一层,看是否存在未被标记的节点,然后向下走。
应用场景: 1.排列组合问题 2.N * N 走迷宫问题 3.连通块
实战分析:
1.排列问题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 15;
int n;
int path[N];
bool st[N];
void dfs(int pos)
{
if(pos > n)
{
for(int i = 1; i <= n; i++)
{
cout<<path[i]<<" ";
}
cout<<endl;
return ;
}
for(int i = 1; i <= n; i++)
{
if(!st[i])
{
path[pos] = i;
st[i] = true;
dfs(pos + 1);
st[i] = false;//恢复现场
}
}
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
2.组合问题
分析问题:
题目可以抽象为从1~n中选数,存在一种选 / 不选的问题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
int n;
int path[N];
bool st[N];
void dfs(int pos)
{
if(pos > n)
{
for(int i = 1; i <= n; i ++)
{
if(st[i]) cout<<i<<" ";
}
cout<<endl;
return ;
}
//不选
dfs(pos + 1);
//选
st[pos] = true;
dfs(pos &#