您的位置:首页 > 其它

桐桐的组合 - UPCOJ 3597 - DFS深度搜索

2017-07-28 01:30 309 查看

题目:

题目描述

  排列与组合是常用的数学方法,桐桐刚刚学会了全排列,就想试试组合,组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。

输入

  两个整数n和r(1≤r≤n≤20)。

输出

  输出所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

样例输入

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


思路:

  和用深度搜索输出全排列类似,类比着写,注意后一项一定大于前一项就OK。

实现:

//
//  main.cpp
//  L
//
//  Created by LucienShui on 2017/7/15.
//  Copyright © 2017年 LucienShui. All rights reserved.
//

#include <bits/stdc++.h>
using namespace std;
#define maxn 27
int a[maxn],n,r;
bool vis[maxn];
void dfs(int cur) {
if(cur == r) {
for(int i=0 ; i<r ; i++) printf("%3d",a[i]);
putchar('\n');
}
else {
for(int i=1 ; i<=n ; i++) {
bool flag = true;
for(int j=0 ; j<cur && flag ; j++) {
if(a[j] == i) flag = false;
}
if(flag) {
if(i<a[cur-1]) continue;
a[cur] = i;
dfs(cur+1);
}
}
}
}
int main (int argc, char* argv[]) {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> r;
dfs(0);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs 搜索 数学 题解 acm