pta-7-49 前t个组合结果 (25分)DFS

题目

组合结果
找出从自然数1、2、… 、n(0<n<=30)中任取r(0<r<=n)个数的组合,输出其中前t个组合结果。

输入格式:

在一行中输入n、r、t(1<=t<=C(n,r))。

输出格式:

按特定顺序输出前t个组合结果,每一个组合结果占一行,含第一个整数在内的每一个整数前面都用一个空格,最后一个整数后面没有空格。 特定顺序:每一个组合结果中的值从大到小排列,组合之间按逆字典序排列。

输入样例:

5 3 10
6 4 8

输出样例:

 5 4 3
 5 4 2
 5 4 1
 5 3 2
 5 3 1
 5 2 1
 4 3 2
 4 3 1
 4 2 1
 3 2 1
 6 5 4 3
 6 5 4 2
 6 5 4 1
 6 5 3 2
 6 5 3 1
 6 5 2 1
 6 4 3 2
 6 4 3 1

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,r,t,sum;
int f[100]={0}; 
int vis[100];
void dfs(int x,int cnt){
	if(sum==t){     //如果到数了退出
		return;
	}
	if(cnt-1==m){
		sum++;
		for (int i=1;i<=m;i++){
			printf(" %d", f[i]);
		}
		printf("\n");
	}
	else{
		for(int i=x;i>0;i--){
			if(!vis[i]){
				vis[i]=1;//标记
				f[cnt]=i;//计数
				dfs(i-1,cnt+1);
				vis[i]=0;
			}
		}
	}
}
int main(){
	scanf("%d %d %d",&n,&m,&t);
	memset(vis,0,sizeof(vis));
	sum=0;
	dfs(n,1);
	return 0;
}
发布了69 篇原创文章 · 获赞 16 · 访问量 9766

猜你喜欢

转载自blog.csdn.net/ChenZIDu/article/details/104147700