2614 - 组合的输出

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。  
    现要求你用递归的方法输出所有组合。  
    例如n=5,r=3,所有组合为:  
    l 2 3   l 2 4   1 2 5   l 3 4   l 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)。  

题目输出

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。 

输入/输出样例

输入格式

5   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

C++解答

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<string>

using namespace std;

int a[100];
bool b[100]={0};
int n,m;

void se(int k)
{
	if(k>m)
	{
		for(int i=1;i<=m;++i)
			printf("%3d",a[i]);
		cout<<endl;
	}
	else
		for(int i=1;i<=n;++i)
			if(!b[i]&&i>a[k-1])
			{
				a[k]=i;
				b[i]=1;
				se(k+1);
				b[i]=0;
			}
}

int main()
{
	cin>>n>>m;
	se(1);
	return 0;
}