void DFS(int k) //处理第k步
{ for (int i=1;i<=m;i++) //第k步中有m种可能
{ //处理第k步
if(k==n) //已经处理完n步,到达目的状态
{ //输出结果;
return;
}
DFS(k+1);//进入第k+1步
}
}
例题1:还是从1-m中取n个数,允许重复
#include<iostream>
using namespace std;
const int MAX=40;
int m,n,a[MAX];
void DFS(int cur)
{ for(int i=1;i<=m;i++)
{ a[cur]=i;
if(cur==n)
{ for(int j=0;j<n;j++)
cout<<a[j]<<" ";
cout<<endl;
return ;//只需注意return ;即可
}
DFS(cur+1);
}
}
int main()
{ cin>>m>>n;
DFS(0);
return 0;
}
例题2:取的这n个数不允许重复(和第一个DFS模板没有什么区别~~~~)
#include<iostream>
using namespace std;
const int MAX=40;
int m,n,a[MAX],visit[MAX];
void DFS(int cur)
{ for(int i=1;i<=m;i++)
{ if(!visit[i])
{ a[cur]=i;
if(cur==n)
{ for(int j=0;j<n;j++)
cout<<a[j]<<" ";
cout<<endl;
return ;
}
visit[i]=1;
DFS(cur+1);
visit[i]=0;
}
}
}
int main()
{ cin>>m>>n;
DFS(0);
return 0;
}
例题3:不允许重复且只能从小到大
#include<iostream>
#include<cstring>
using namespace std;
const int MAX=40;
int n,m,a[MAX];
void DFS(int cur)
{ for(int i=a[cur-1]+1;i<=m-n+cur;i++)
{ a[cur]=i;
if(cur==n+1)
{ for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return ;
}
DFS(cur+1);
}
}
int main()
{ cin>>m>>n;
DFS(1);
return 0;
}