XYNUOJ 1275: 组合的输出

1275: 组合的输出

时间限制: 1 Sec   内存限制: 128 MB
提交: 17   解决: 9
[ 提交][ 状态][ 讨论版]

题目描述

[问题描述]
从n个数中取出r个元素,输出所有组合
[输入格式]
一行两个自然数n和r (1<n<21,1<=r<=n)
[输出格式]
所有的组合,每个组合占一行,其中的元素从小到大排序,用一个空格隔开,所有组合按字典序。
[输入样例]
5 3
[输出样例]
1 2 3
1 2 4
1 2 5
1 3 4
……(太多,此处省略)

来源

搜索 

简单的深搜

刚开始用了一个next_permutation函数,但是如果剩余的位数多了就会出现重复,比如,如果从10个数里选择3个进行排序,则会出现7次重复

#include<stdio.h>
#include<string.h> 
int n,r;
int visit[25],a[25],b[25];
int dfs(int k,int flag){
	if(k==r+1){
		for(int i=1;i<r;i++){
			printf("%d ",b[i]);
		}
		printf("%d\n",b[r]);
	}
	else{
		for(int i=0;i<n;i++){
			if(!visit[i]&&a[i]>flag){
				visit[i]=1;
				b[k]=a[i];
				flag=a[i];
				dfs(k+1,flag);
				visit[i]=0;//回溯 
			}
		}
	}
}
int main(){
	while(scanf("%d %d",&n,&r)!=EOF){
		memset(visit,0,sizeof(visit));
		for(int i=0;i<n;i++){
			a[i]=i+1;
		}
		dfs(1,0);
	}
	return 0; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值