排列组合,子集生成问题,与nyoj 组合数

最近卡了一下暴力求解,因为比较贪玩,所以进度比较缓慢,百度到的总看不太明白,又没人教,所以决定自己来写一个简单易懂的,毕竟不会这个的一般都是小白,这样和我类似情况的学弟学妹们看到了也能给他节省点时间。好了不说废话了,还是谈谈这类问题吧

一  枚举排列:

问题: 输出一段数的所有排列。

输入 3

输出

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

解析:

运用递归来解决问题,设置一个数组num用来保存答案,从num[0]开始,每一位从小到大的尝试填入所有的数,并且保证填入的这个数不会在同一个排列中被填两次,当填到最后一位时输出答案。

代码如下:

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
void print_permutation(int n,int *num,int cur){//在这里 cur 的值有两个作用。1 判断填了多少个数了.  2 将数填入num[cur]中。
	if(cur==n){//因为填入第三个数之后会运行print_.....() 所以实际上在输出时cur=3但此时只有num[0]--num[2]有值
		for(int i=0;i<n;i++)printf("%d ",num[i]);
		printf("\n");
	}
	else for(int i=1;i<=n;i++){//循环填入cur值
		int ok=1;//用来记录当前要填入的值i是不是重复了。
		for(int j=0;j<cur;j++){//用来判断是不是已经有过了
			if(i==num[j])ok=0;
		}
		if(ok){
			num[cur]=i;//既然没有重复,那么就说明可以填,就填进去
			print_permutation(n,num,cur+1);//判断下一位
		}
	}
}
int main(){
	int num[15],n;
	while(cin>>n,n){
		for(int i=0;i<n;i++)num[i]=0;//清空数组
		print_permutation(n,num,0);
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值