全排列:
将一个包含了N个元素的数组进行所有可能组合的排列。
例如: 问题: 我们将集合a[]={1,2,3}进行排列,如何进行解决?
这里,我们可以运用分治的思路将问题转化为
以下三个新的问题:
- 1开头的全排列
- 2开头的全排列
- 3开头的全排列
我们利用DFS与回溯的概念,
当我们分到最后一个字符串数字的时候即可判断是否满足条件!
——以此得到下图的概念
即得到以下6个排列!
1,2,3 | 1,3,2 |
---|---|
2,1,3 | 2,3,1 |
3,1,2 | 3,2,1 |
题目代码:
#include "stdio.h"
#include "windows.h"
void swap(int &a, int &b) {//交换函数
int t = a;
a = b;
b = t;
}
void perm(int *data, int index, int end) {
if (index == end) {//当我分到最后一个数字了,判断条件
for (int i = 0; i < end; i++)
printf("%d", data[i]);
printf("\n");
}
else
for (int i = index; i < end; i++) {//从index 开始 其实枝剪了一部分
swap(data[i], data[index]);//交换
perm(data, index + 1, end);//dfs调用
swap(data[i], data[index]);//复原
}
}
int main() {
int data[] = { 1,2,3 };
perm(data, 0, 3);
return 0;
}