这是一个深度搜索的递归,个人觉得凭借脑子想很难理解
这是本题AC代码
这里如果是排列题型(顺序很重要)如本题
直接套用模板
int path[10]
bool vis[10]
然后dfs(pos)pos:位置
写递归终止条件如果从n中选cnt个,if(pos>cnt)写输出代码;
写递归继续代码,最好能背下来
for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                vis[i]=true;
                path[pos]=i;
                dfs(pos+1);
                vis[i]=false;
            }
        }
    }
之后main中dfs(1);
以下是本题整体代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int path[10];
bool vis[10];
void dfs(int pos)
{
    if(pos>n)
    {
        for(int i=1;i<=n;i++)
        {
            if(i!=1)
            cout<<" ";
            cout<<path[i];
        }
        cout<<endl;
        return ;
    }
    else
    {
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                vis[i]=true;
                path[pos]=i;
                dfs(pos+1);
                vis[i]=false;
            }
        }
    }
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}
之后在说说组合(与顺序无关)
vector<int>res;自己创建数组
写终止条件dfs(int pos ,int cnt)if(cnt==m)输出;
else for循环(i=start,i<=n,i++)从不回头向前走+res.pop_back()回溯;
for(int i=start;i<=n;i++)
          {
              res.push_back(i);
              dfs(i+1,cnt+1);
              res.pop_back();
          }