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},{3,2,1}
#include
#include
using namespace std;
int n;
vector ans;
void show(){
for(int i=0;i>n;
dfs(1);
return 0;
}
- 二、 next_permutation
生成下一个全排列并判断是否生成了所有n!个排列
#include
#include
#include
using namespace std;
int n;
vector ans;
void show(){
for(int i=0;i>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
#include
using namespace std;
int n;
vector ans;
void show(){
for(int i=0;i>n;
dfs(1);
return 0;
}