DFS模板:向深处搜索,直到找到解或者走不下去。这一般解决全排列问题
Void DFS(deep,...){
if(找到解 || 走不下去了){
......//根据题意添加
return;
}
for(扩展方式){
if(扩展方式所能达到的状态合法){
修改操作;//根据题意添加
标记;
DFS(deep+1,...);
//根据题意是否要还原
}
}
}
BFS模板:通常用队列先进先出实现,解决最小时间/最小步数
void BFS(){
初始化队列Q;
起点S入队;
标记S已经访问;
while(Q非空){
取Q的队首元素U;
U出队列;
if(u==目标状态){
返回结果;
}
for(所有与U相邻的元素){
if(相邻的元素合法 && 未访问){
入队;
标记访问;
}
}
}
}
一、DFS入门题
#include<iostream>
using namespace std;
int n;
int vis[10]={0};
int a[10];
void dfs(int index){
if(index==n+1){
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i]=1;
a[index]=i;
dfs(index+1);
vis[i]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
2.组合的输出,这个有要剪枝
#include<iostream>
using namespace std;
int n,m;
int vis[10]={0};
int a[10];
int p[10]={0};
void dfs(int index){
if(index==m+1){
for(int i=1;i<=m;i++)
cout<<a[i]<<" ";
cout<<endl;
}
for(int i=1;i<=n;i++){
if(vis[i]==0 && i>a[index-1]){//i>a[index-1]就是剪枝
vis[i]=1;
a[index]=i;
dfs(index+1);
vis[i]=0;
}
}
}
int main()
{
cin>>n>>m;
dfs(1);
return 0;
}