1. 程式人生 > >【DFS】組合的輸出

【DFS】組合的輸出

題目

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

現要求你用遞迴的方法輸出所有組合。

例如n=5,r=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

輸入

一行兩個自然數n、r(1<n<21,1≤r≤n)。

輸出

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

樣例輸入#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

題解

這道題非常簡單就是道水題

#include<iostream>
#include<cstring>
using namespace std;
int a[100],b[100],n,r;
void dfs(int k) {
	for (int i=a[k-1]+1; i<=n; ++i)
		if (!b[i]) {
			a[k]=i;
			b[i]=1;
			if (k==r) {
				for (int j=1; j<=r; ++j)
					printf("%3d",a[j]);
				cout << endl;
			}
			else dfs(k+1);
			b[i]=0;
		}
}

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