关于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);
    }
}

猜你喜欢

转载自blog.csdn.net/qingyingliu/article/details/79521922