1. 程式人生 > 實用技巧 >洛谷-P1157 組合的輸出

洛谷-P1157 組合的輸出

洛谷-P1157 組合的輸出

原題連結:https://www.luogu.com.cn/problem/P1157


題目描述

排列與組合是常用的數學方法,其中組合就是從\(n\)個元素中抽出\(r\)個元素(不分順序且\(r \le n\)),我們可以簡單地將\(n\)個元素理解為自然數\(1,2,…,n\),從中任取\(r\)個數。

現要求你輸出所有組合。

例如\(n=5,r=3\),所有組合為:

\(12 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\)

輸入格式

一行兩個自然數\(n,r(1<n<21,0 \le r \le n)\)

輸出格式

所有的組合,每一個組合佔一行且其中的元素按由小到大的順序排列,每個元素佔三個字元的位置,所有的組合也按字典順序。

**注意哦!輸出時,每個數字需要\(3\)個場寬,pascal可以這樣:

write(ans:3);

輸入輸出樣例

輸入 #1

5 3 

輸出 #1

  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

C++程式碼

#include <iostream>
#include <iomanip>
using namespace std;

int n, r, a[100];

void dfs(int k) {
    if (k > r) {
        for (int i=1; i<=r; ++i)
            cout << setw(3) << a[i];
        cout << endl;
        return ;
    }
    for (int i=a[k-1]+1; i<=n; ++i) {
        a[k] = i;
        dfs(k+1);
    }
}

int main() {
    cin >> n >> r;
    dfs(1);
    return 0;
}