nyoj 32-組合數(DFS)
阿新 • • 發佈:2019-02-01
組合數
時間限制: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); } }