DFS
常用到vis数组做标记
一般形式:
DFS(某状态){
如果搜出一种结果 返回;
在所有能做出的选择中{
做出该选择并记录该选择做过;
DFS(选择后的状态)
取消该选择以及对该选择的记录;
}
}
- 一、 全排列
输入n,按字典输出所有1-n的全排列,n不超过10
输入3,输出{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},
#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> ans;
void show(){
for(int i=0;i<ans.size();i++){
printf("%5d",ans[i]);
}
cout<<endl;
return;
}
int vis[12];
void dfs(int num){
if(num==n+1){
show();
return;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
ans.push_back(i);
vis[i]=1;
dfs(num+1);
ans.pop_back();
vis[i]=0;
}
}
}
int main(){
cin>>n;
dfs(1);
return 0;
}
- 二、 next_permutation
生成下一个全排列并判断是否生成了所有n!个排列
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n;
vector<int> ans;
void show(){
for(int i=0;i<ans.size();i++){
printf("%5d",ans[i]);
}
cout<<endl;
return;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
ans.push_back(i);
}
do{
show();
}while(next_permutation(ans.begin(),ans.end()));
return 0;
}
- 三、 子集合
{1 ,2,3}需输出{ },{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}
N个元素的子集有2^n个
#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> ans;
void show(){
for(int i=0;i<ans.size();i++){
printf("%5d",ans[i]);
}
cout<<endl;
return;
}
void dfs(int num){
if(num==n+1){
show();
return;
}
ans.push_back(num);
dfs(num+1);
ans.pop_back();//选
dfs(num+1);//不选
return;
}
int main(){
cin>>n;
dfs(1);
return 0;
}
ljm要加油