码迷,mamicode.com
首页 > 其他好文 > 详细

dfs的几个基础示例

时间:2019-05-02 23:16:07      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:排列   tor   ret   cin   不同   main   一个   turn   oid   

 11~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 }
View Code

 

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 }
View Code

 

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 }
View Code

 

dfs的几个基础示例

标签:排列   tor   ret   cin   不同   main   一个   turn   oid   

原文地址:https://www.cnblogs.com/itdef/p/10803602.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!