回溯法
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();
}
}
}
}

浙公网安备 33010602011771号