1.dfs指数型(集合)模板
#dfs指数型(集合)
int n;
bool used[N];//记录每个数的状态
void dfs(int idx)
{
if(idx==n+1)
{
for(int i=1;i<=n;i++)
{
if(used[i]==true)//将状态确认的数字打印出;
{
cout<<i<<" ";
}
}
cout<<endl;
return ;
}
used[idx]=true;//将此时这个数字考虑在确认
dfs(idx+1);//转入下一个数字进行确认;
used[idx]=false;//将此时这个数字不考虑确认;
dfs(idx+1); //转入下一个数字进行确认;
//下面代码段与上面满足的效果一样,区别的在不是按字典顺序输出,但是只需要该枚举逆序;
//for(int j=0;j<=1;j++)
//{
//used[idx]=j;
//dfs(idx+1);
//}
}
main()
{
cin>>n;
dfs(1);
}
一些比较好的题目参考:acwing里面的、力扣的题目挺不错的
2.dfs全排列模板
bool used[N];//存储第i位数字是否有被使用过;
int st[N];//存储数字;
void dfs(int u)//u代表第几个位置
{
if(u==n+1)
{
for(int i=1;i<=n;i++)
{
cout<<st[i]<<" ";
}
puts("");
return ;
}
for(int i=1;i<=n;i++)//从1开始枚举
{
if(!used[i])//判断是否有没有被使用过
{
st[u]=i;//将数字存储起来;
used[i]=true;
dfs(u+1);//下一个位置
used[i]=false;//这里利用回溯的思想,
}
}
}
main()
{
dfs(1);
}
这里有很多参考题目,比如 : 洛谷的全排列问题、acwing里面的
3.dfs组合型模板
#dfs组合型
int n,m;//从n中选m个;
int st[10];//存放数字
void dfs(int idx,int start)//需要记录从哪一个数字开始枚举;
{
if(idx==m+1)
{
for(int i=1;i<=m;i++)
{
cout<<st[i]<<" ";
}
cout<<endl;
return ;
}
for(int i=start;i<=n;i++)
{
st[idx]=i;
dfs(idx+1,i+1);
}
}
int main()
{
cin>>n>>m;
dfs(1,1);
}
题目参考:acwing里面的,比较简单