首页 > 学院 > 开发设计 > 正文

排列、组合和全排列

2019-11-08 03:13:44
字体:
来源:转载
供稿:网友

//组合

//1---5里面5个数选出来3个

#include<iostream>using namespace std;int v[6] = { 0 };int a[4];int sum = 0;void f(int num,int flag, int n){	if (n == 3){		sum++;		for (int l = 0; l < 3; l++)			PRintf("%d ", a[l]);		printf("/n");	}	else{		for (int j = 1; j < 6; j++){			if (v[j] == 0&&j>flag){				a[n] = j;				v[j] = 1;				f(j+1,j, n + 1);				a[n] = 0;				v[j] = 0;			}		}	}}int main(){	f(0,0, 0);	printf("sum=%d", sum);	return 0;}

//排列

//在选取的基础上全排列,其实上个代码改一下就行

#include<iostream>using namespace std;int v[6] = { 0 };int a[4];int sum = 0;void f( int num,int n){	if (n == 3){		sum++;		for (int l = 0; l < 3; l++)			printf("%d ", a[l]);		printf("/n");	}	else{		for (int j = 1; j < 6; j++){			if (v[j] == 0 ){				a[n] = j;				v[j] = 1;				f( j, n + 1);				a[n] = 0;				v[j] = 0;			}		}	}}int main(){		f( 0, 0);	printf("sum=%d", sum);	return 0;}

//全排列

#include<iostream>using namespace	std;int b[4] = { 1, 2, 3};int v[4] = { 0 };int a[3];void f(int i){	if (i == 3){		for (int i = 0; i < 3; i++)			printf("%d ", b[i]);		printf("/n"); 	}	else{		for (int j = i; j < 3; j++){				swap(b[i], b[j]);				f(i + 1);				swap(b[i], b[j]);		}	}}int main(){	f( 0);	return 0;}这里如果数字是1 2 2 ,就会出现重复。接下来给个去重便可

#include<iostream>using namespace	std;int b[4] = { 1, 2, 2};int v[4] = { 0 };int a[3];int pd(int i, int j){	for (int k = i; k < j;k++)	if (b[k] == b[j])		return 0;	return 1;}void f(int i){	if (i == 3){		for (int i = 0; i < 3; i++)			printf("%d ", b[i]);		printf("/n"); 	}	else{		for (int j = i; j < 3; j++){			if (pd(i, j)){				swap(b[i], b[j]);				f(i + 1);				swap(b[i], b[j]);			}					}	}}int main(){	f( 0);	return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表