这是一个深度搜索的递归,个人觉得凭借脑子想很难理解
这是本题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)输出;
写终止条件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();
}
{
res.push_back(i);
dfs(i+1,cnt+1);
res.pop_back();
}



京公网安备 11010502036488号