C++手动实现全排列

全排列,也就是排列组合

123全排列。
123 132 213 231 312 321

思路:
由1为起始的全排列也就是2,3的全排列,2,3的全排列就是分别以2和3起始的全排列。
这是一个递归的过程
具体每一步的解析都在代码里

//
// Created by Night on 2020/7/16.
//
#include
#include

using namespace std;
int a[] = {1, 2, 3, 3};
int ans = 0;
int len = sizeof(a) / sizeof(a[0]);
/*
*递归回溯生成全排列,假如check可以适用于重复元素的情况
*考虑第K位,前面已经排定
*/
int check(int n, int i) {    //检查第i个元素是否在前面n......i-1中出现过
    if (i > n) {
        for (int j = n; j < i; ++j) {
            if (a[i] == a[j])
                return 0;
        }
    }
    return 1;   //没出现返回1
}

void perm(int k) {
    if (k == len){  //排列的数字达到要求
        for (int j = 0; j <len ; ++j) {
            printf("%d ",a[j]);
        }
        ans++;
        printf("\n");
    }
    //从K往后的数字都可以放在K位
    for (int i = k; i < len; i++) {
        if (check(k, i)) {           //这样做的目的是使排列不会产生重复的结果
            swap(a[i], a[k]);  //递归保证自数列的第一个元素与该子数列中每一个元素进行一次交换,进行排列。
            perm(k + 1);         //对从k+1到数组最末端的元素进行全排列
            swap(a[i], a[k]);//回溯,使数组倒回原来的样子
        }
    }
}

int main() {
    perm(0);
    printf("有%d种方案",ans);
    return 0;
}

你可能感兴趣的:(算法)