全排列问题
全排列
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <queue> 5 #include <algorithm> 6 #include <cstdio> 7 8 using namespace std; 9 #define MAX_N 10 10 int n; //共n 个数 11 int rcd[MAX_N]; //记录每个位置填的数 12 int used[MAX_N]; //标记数是否用过 13 int num[MAX_N]; //存放输入的n 个数 14 void full_permutation(int l) { 15 int i; 16 if (l == n) { 17 for (i = 0; i < n; i++) { 18 printf("%d", rcd[i]); 19 if (i < n - 1) 20 printf(" "); 21 } 22 printf("\n"); 23 return; 24 } 25 for (i = 0; i < n; i++) // 枚举所有的数(n个), 循环从开始 26 if (!used[i]) { //若num[i] 没有使用过, 则标记为已使用 27 used[i] = 1; 28 rcd[l] = num[i]; //在l 位置放上该数 29 full_permutation(l + 1); //填下一个位置 30 used[i] = 0; // 清标记 31 } 32 } 33 34 int read_data() { 35 int i; 36 n = 3; 37 for (i = 0; i < n; i++) 38 num[i] = i; 39 for (i = 0; i < n; i++) 40 used[i] = 0; 41 42 return 1; 43 } 44 45 void recursive_permutation(int l) { //直接在数据上做全排列,只用到了num和n 46 int i; 47 if (n == l) { 48 for (i = 0; i < n; i++) { 49 printf("%d", num[i]); 50 if (i < n - 1) 51 printf(" "); 52 } 53 cout << endl; 54 return; 55 } 56 for (i = l; i < n; i++) { 57 swap(num[i], num[l]); 58 recursive_permutation(l + 1); 59 swap(num[i], num[l]); 60 } 61 62 } 63 64 int main() { 65 read_data(); 66 full_permutation(0); 67 recursive_permutation(0); 68 return 0; 69 }
不重复的全排列
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <queue> 5 #include <algorithm> 6 #include <cstdio> 7 8 using namespace std; 9 #define MAX_N 10 10 int n; //共n 个数 11 int m;//共m种数 12 int rcd[MAX_N]; //记录每个位置填的数 13 int used[MAX_N]; //标记每个数字可以用的次数 14 int num[MAX_N]; //存放输入的n 个数 15 int read_data() { 16 int i; 17 n=4; 18 m=2; 19 for (i = 0; i < n; i++) 20 num[i]=i; 21 for (i = 0; i < n; i++) 22 used[i] = 2; 23 return 1; 24 } 25 26 void unrepeat_permutation(int l) { 27 int i; 28 if (l == n) { // 填完了n 个数,则输出 29 for (i = 0; i < n; i++) { 30 printf("%d", rcd[i]); 31 if (i < n - 1) 32 printf(" "); 33 } 34 printf("\n"); 35 return; 36 } 37 for (i = 0; i < m; i++) // 枚举m 个本质不同的数,跟全排列的主要区别 38 if (used[i] > 0) { //若数num[i] 还没被用完,则可使用次数减 39 used[i]--; 40 rcd[l] = num[i]; //在l 位置放上该数 41 unrepeat_permutation(l + 1); //填下一个位置 42 used[i]++; //可使用次数恢复 43 } 44 } 45 int main() { 46 read_data(); 47 unrepeat_permutation(0); 48 return 0; 49 }