关于dfs的总结(都是套路~)

关于DFS的总结和简单应用

说实话,我练了那么久搜索题,总该得到一些东西。今天,我千(bai)思(du)万(yi)想(xia),还是决定总结出一套模板来。

目前,我做dfs的类型一般都是借助递归的方法来实现的,因为用递归的方法比较容易理解。
所以递归方式的dfs模板如下:

    (type)  dfs(parameter)//注意在需要剪枝的情况下,可能需要把各种参数都写在函数上
    {
        if(搜索到了)
        {
            cout......//可能需要输出什么东西
            return type
        }
        else
        {
            继续搜索
        }
    }

OK,写完了模板,下面就让我们来应用一下把。(看题)

组合数

描述
找出从自然数1、2、… 、n(n<10)中任取r(r<=n)个数的所有组合。

输入
输入n、r。

输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。

样例输入
5 3
样例输出
543
542
541
532
531
521
432
431
421
321


#include<bits/stdc++.h>
using namespace std;
int a[]={0,1,2,3,4,5,6,7,8,9};
int n,m;
void dfs(int num,string s,int counter)//注意参数的个数
{
    s+='0'+num;
    if(counter==m)//搜索到了
    {
        cout<<s<<endl;
        return ;//回溯
    }
    for(int j=num-1;j>0;j--)
    {
         dfs(j,s,counter+1);//继续搜索
    }
}
int main()
{

    while(cin>>n>>m)
    {
        string s;
        for(int i=n;i>0;i--)
            dfs(i,s,1);
    }
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值