您的位置:首页 > 其它

nyoj 32-组合数(DFS)

2014-01-08 21:45 274 查看
http://acm.nyist.net/JudgeOnline/problem.php?pid=32


组合数

时间限制:3000 ms  |  内存限制:65535 KB
难度:3

描述找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。

输入输入n、r。
输出按特定顺序输出所有组合。

特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3


样例输出
543
542
541
532
531
521
432
431
421
321

#include<iostream>
using namespace std;
int a[100];
void group(int m, int k) {
for (int i = m; i >= k; i--) {
a[k] = i;  //先添加
if (k > 1)
group(i - 1, k - 1);  //
else {
for (int j = a[0]; j > 0; j--)
cout << a[j];
cout << endl;
}
}
}
int main() {
int m, k;
cin >> m >> k; // 5 3
a[0] = k; //输出的位数
group(m, k);
}

#include<iostream>
#include<cstring>
using namespace std;
int a[12];
bool visit[12];
void DFS(int x, int cur, int deep) { //入口、当前层、总层数
if (cur > deep) return; //结束条件
for (int i = x; i >= 1; i--) { //尝试将 i插入到 a[cur]
if (!visit[i]) {
visit[i] = true;
a[cur] = i;
if (cur == deep) {
for (int i = 1; i <= deep; i++)
cout << a[i];
cout << endl;
}
DFS(i - 1, cur + 1, deep);
visit[i] = false;
}
}
}
int main() {
int m, n;
while (cin >> m >> n) {
memset (visit, false, sizeof(visit));
DFS(m, 1, n);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: