dfs
这几天学习了以下dfs,下面是我的一些学习过程。
dfs就是深度优先搜索,比较通俗一点的说法就是把一条路走到头再返回走另一条路。
首先是dfs的一般模板
void dfs(int step)
{
判断边界
{
相应操作,通常是输出结果
}
尝试每一种可能
{
满足条件
标记
继续下一步dfs(step+1)
恢复现场
}
}
下面就以一个题目为例子吧
这个题是洛谷的P1706 全排列问题,是一个相当经典可以用dfs解决的问题
题目如下
题解
#include <iostream>
using namespace std;
int a[10],book[10],n; //数组a用于 存储数组,数组book用于判断数字是否被使用
void dfs(int step)
{
int i;
if(step==n)
{
for(i=0;i<n;i++) cout<<" "<<a[i];
cout<<endl;
return;
} //满足条件则输出
for(i=0;i<n;i++)
{
if(book[i]==0)
{
a[step]=i+1;
book[i]=1;
dfs(step+1);
book[i]=0;
}
} //核心部分,进行dfs
return;
}
int main()
{
cin>>n;
dfs(0);
return 0;
}
还有一个难一点的题
题解
#include <vector>
#include <iostream>
using namespace std;
vector<int>a;
int n,m=0;
void dfs(int b,int c)
{
int i;
if(b==n)
{
cout<<n<<'='<<a[0];
for(i=1;i<a.size();i++)
{
cout<<'+'<<a[i];
}
m++;
if(m%4==0) cout<<endl;
else if(a[0]!=n) cout<<';';
return;
}
for(i=c;i<=n-b;i++)
{
a.push_back(i);
dfs(b+i,i);
a.pop_back();
}
}
int main()
{
cin>>n;
dfs(0,1);
return 0;
}
dfs对于初学来说是比较难理解的,下面是几篇大佬的文章可以学习一下。
DFS(深度优先搜索算法)
DFS(深度优先搜索算法)入门保姆级超详解