【练习回顾】再看全排列

递归

递归直接翻译自我们自己书写全排列时的思路。

\(A_{n}^{n}\) 即为从第1位起到第n位中,每一位均按升序将排列内容遍历。

\[\begin{align*} A_{n}^{n} & = n \cdot A_{n-1}^{n-1} \\ & = n \cdot (n-1) A_{n-2}^{n-2} \\ & = \ ... \\ \end{align*} \]

#include<stdio.h>
#define MAXN 10
#define PRINT(A) for(int i=0;i<N;++i)printf("%d ",A[i]);puts("")
/* print full_permutation of 1~N */
int N;
int IsUsed[MAXN],Arr[MAXN]; //IsUsed[i]==1 means i+1 is used

void fullPermutation(int index){
    if(index >= N){
        PRINT(Arr);
        return;
    }
    for(int i=0;i<N;++i){
        if(IsUsed[i] == 0){
            Arr[index] = i+1; //在排列中index位置填入一个数
            IsUsed[i] = 1;
            fullPermutation(index+1);
            IsUsed[i] = 0;
        }
    }
}

int main(){
    scanf("%d",&N);
    fullPermutation(0);
    return 0;
}

非递归

要把自然的逻辑肢解成数字规律

posted @ 2021-10-31 14:28  Xlucidator  阅读(43)  评论(0编辑  收藏  举报