简单全排列的逻辑(递归实现)

全排列:

将一个包含了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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43910320/article/details/88816627
今日推荐