回溯法

dfs时把条件回溯到上一个节点

1.求Cnm LC77

int vis[25];
vector<int> v;
vector<vector<int>> ans;
vector<vector<int>> combine(int n, int k) {
    /*
        CNM dfs一个没访问且大于i的数
    */
    memset(vis,0,sizeof(vis));
    dfs(1,0,n,k);
    return ans;
};
void dfs(int num,int s,int n,int k){
    if(s==k){
       // cout<<"return"<<endl;
        ans.push_back(v);
        return ;
    }
    //找的数要比当前节点数大 
    for(int i=num;i<=n;i++){
        if(!vis[i]){
            // cout<<"num "<<i<<endl;
            // cout<<"s "<<s<<endl;
            v.push_back(i);
            vis[i]=1;
            dfs(i,s+1,n,k);
            v.pop_back();
            vis[i]=0;
        }
    }  
};

2.求Anm LC46

vector<int> v;
vector<vector<int>> ans;
int vis[10];
int l;
vector<vector<int>> permute(vector<int>& nums) {
    l=nums.size();
    memset(vis,0,sizeof(vis));
    dfs(0,nums);
    return ans;
}
void dfs(int s,vector<int>& nums){
    if(s==l){
        ans.push_back(v);
        return ;
    }else{
        //找的数从0开始找
        for(int i=0;i<l;i++){
            if(!vis[i]){
                vis[i]=1;
                v.push_back(nums[i]);
                dfs(s+1,nums);
                vis[i]=0;
                v.pop_back();
            }
        }
    }
}
posted @ 2022-09-13 18:58  lwx_R  阅读(36)  评论(0)    收藏  举报