1. 程式人生 > >nyoj 32-組合數(DFS)

nyoj 32-組合數(DFS)

組合數

時間限制: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);
  }
}