Kirarrr

导航

Full permutation

Full Permutation


全排列问题, 将1~n这n个整数按字典序排放

  • 划分:

    • 输出1开头的全排列
    • 输出2开头的全排列
    • ......
    • 输出n开头的全排列
  • 递归边界:当下标1 ~ n 位都已经填好了,此时表示排列已经生成,可以输出。

  • 递归子式:即上述划分

//以3为例的全排列
#include <cstdio>

const int maxn = 11;
int n, p[maxn], hashTable[maxn] = {false};
//p为当前排列,hashTable记录x是否在p中
void generateP(int index) {
    if (index == n + 1) {   //递归边界
        for (int i = 1; i <= n; i++) {
            printf("%d", p[i]);
        }
        printf("\n");
        return;
    }
    for (int x = 1; x <= n; x++) {
        if (hashTable[x] == false) {
            p[index] = x;
            hashTable[x] = true;  //记录x已在p中
            generateP(index + 1); //处理下一位
            hashTable[x] = false;   //已处理完p[index]为x的子问题,还原状态
        }
    }
}

int main() {
    n = 3;
    generateP(1);
    return 0;
}

posted on 2019-01-29 01:07  Kirarrr  阅读(102)  评论(0编辑  收藏  举报