全排列问题

 

全排列

 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 }

 

 

 

 

 

 

 

posted on 2012-08-04 13:18  kakamilan  阅读(134)  评论(0编辑  收藏  举报

导航