dfs的几个基础示例
Posted itdef
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfs的几个基础示例相关的知识,希望对你有一定的参考价值。
1 从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 2 3 输入格式 4 输入一个整数n。 5 6 输出格式 7 每行输出一种方案。 8 9 同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。 10 11 对于没有选任何数的方案,输出空行。 12 13 本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。 14 15 数据范围 16 1≤n≤15 17 输入样例: 18 3 19 输出样例: 20 21 3 22 2 23 2 3 24 1 25 1 3 26 1 2 27 1 2 3
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 vector<int> result; 7 vector<int> v; 8 int n; 9 10 void dfs(int i) 11 { 12 if(i == n){ 13 for(auto& e:result){ 14 cout << e << ‘ ‘; 15 } 16 cout <<endl; 17 return; 18 } 19 20 result.push_back(v[i]); 21 dfs(i+1); 22 result.pop_back(); 23 24 dfs(i+1); 25 26 } 27 28 int main() 29 { 30 31 cin >> n; 32 for(int i= 1;i <=n;i++){ 33 v.push_back(i); 34 } 35 36 dfs(0); 37 38 return 0; 39 }
从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。 输入格式 两个整数 n,m ,在同一行用空格隔开。 输出格式 按照从小到大的顺序输出所有方案,每行1个。 首先,同一行内的数升序排列,相邻两个数用一个空格隔开。 其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 5 7排在1 3 6 8前面)。 数据范围 n>0 , 0≤m≤n , n+(n−m)≤25 输入样例: 5 3 输出样例: 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5
1 #include <iostream> 2 #include <vector> 3 4 5 using namespace std; 6 7 int n ,m; 8 vector<int> result; 9 vector<int> v; 10 11 void dfs(int i){ 12 if(result.size() == m){ 13 for(auto& e:result){ 14 cout << e << ‘ ‘; 15 } 16 cout <<endl; 17 return; 18 }else if(i == n){ 19 return; 20 } 21 22 result.push_back(v[i]); 23 dfs(i+1); 24 result.pop_back(); 25 26 dfs(i+1); 27 } 28 29 30 int main() 31 { 32 cin >> n >> m; 33 for(int i = 1;i <= n;i++){ 34 v.push_back(i); 35 } 36 37 dfs(0); 38 }
把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。 输入格式 一个整数n。 输出格式 按照从小到大的顺序输出所有方案,每行1个。 首先,同一行相邻两个数用一个空格隔开。 其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。 数据范围 1≤n≤9 输入样例: 3 输出样例: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 vector<int> v; 7 8 int n ; 9 10 void dfs(int i, vector<int>& result){ 11 if(i== n){ 12 for(auto& e:result){ 13 cout << e << ‘ ‘; 14 } 15 cout <<endl; 16 return; 17 } 18 19 for(int j = 0; j < v.size();j++){ 20 if(v[j] != 0){ 21 result[i] = v[j]; 22 v[j] = 0; 23 dfs(i+1,result); 24 v[j] = result[i] ; 25 } 26 } 27 } 28 29 int main() 30 { 31 cin >> n; 32 for(int i= 1; i<=n;i++){ 33 v.push_back(i); 34 } 35 vector<int> result(n,0); 36 37 dfs(0,result); 38 39 return 0; 40 }
以上是关于dfs的几个基础示例的主要内容,如果未能解决你的问题,请参考以下文章