分治法(排列问题)

对数组a[] = {1,2,3,4}进行全排列

可以看成对1{2,3,4},2{1,3,4},3{1,2,4},4{1,2,3}进行全排列

也可以看成对12{3,4},13{2,3},14{2,3},21{3,4},23{1,4},24{1,3},31{2,4},32{1,4},34{1,2},41{3,2},42{3,1},43{1,2}进行全排列

......

即确定前缀,对剩下的元素进行全排列。

双指针,一个确定当前前缀的下标,另一个确定与其交换元素的下标

层层递归,直到当前前缀下标 = 数组的长度len-1(下标从0开始)

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 #define mem(a, b) memset(a, b, sizeof a)
 5 
 6 typedef long long ll;
 7 int dir8[8][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
 8 int dir4[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
 9 const int INF = 0x3f3f3f3f;
10 int mod = 1e9 + 7;
11 const int maxn = 305;
12 void print(int* a) {
13     for(int i = 0; i < 4; i++) {
14         cout << a[i];
15         if(i < 3) cout << " ";
16         else cout << endl;
17     }
18 }
19 void perm(int* a,int m,int k) {
20     if(m == 3) {
21         print(a);
22         return ;
23     }
24     for(int i = k; i < 4; i++) {
25         swap(a[m],a[i]);
26         perm(a,m+1,k+1);
27         swap(a[m],a[i]);
28     }
29 }
30 int main()
31 {
32     int a[4] = {1,2,3,4};
33     perm(a,0,0);
34     return 0;
35 }
原文地址:https://www.cnblogs.com/LLLAIH/p/11452390.html