排列、组合和全排列

来源:互联网 发布:mysql 读法 编辑:程序博客网 时间:2024/06/10 08:37

//组合

//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 namespacestd;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 namespacestd;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;}


0 0