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;
}
posted @ 2021-11-16 21:32  0x3fffffff  阅读(28)  评论(0编辑  收藏  举报