生成1~n的排列的三種方法

#include <cstdio>
#include <algorithm>

const int MAXN = 10;

bool used[MAXN + 1];
int n, a[MAXN + 1];

void search(int i)
{
    if (i == n + 1)
    {
        for (int i = 1; i <= n; i++) printf("%d%c", a[i], i == n ? '\n' : ' ');
        return;
    }

    for (int j = 1; j <= n; j++)
    {
        if (!used[j])
        {
            used[j] = true;
            a[i] = j;
            search(i + 1);
            used[j] = false;
        }
    }
}

void print_permutation(int n, int *A, int cur)  //用*A傳A數組
{
    if (cur == n) //遞歸邊界
    {
        for (int i = 0; i < n; i++) printf("%d ", A[i]);
        printf("\n");
    }
    else for (int i = 1; i <= n; i++) //嘗試在A[cur]中填各種整數i
    {
        int ok = 1;
        for (int j = 0; j < cur; j++)
            if (A[j] == i) ok = 0; //即i已經在A[0]~A[cur-1]中出現過
        if (ok) //說明i沒有在序列中出現過
        {
            A[cur] = i; //把它添加到序列末尾
            print_permutation(n, A, cur + 1); //遞歸調用
        }
    }
}

int main()
{
    scanf("%d", &n);

    search(1);


    static int a[MAXN + 1];
    for (int i = 1; i <= n; i++) a[i] = i;

    do
    {
        for (int i = 1; i <= n; i++) printf("%d%c", a[i], i == n ? '\n' : ' ');
    }
    while (std::next_permutation(a + 1, a + n + 1)); //如果循環完了就會返回一個false
      //next_permutation傳的參數和sort一樣

}

這三種隨便寫一種就行
【代碼其中之一來自紫書,其他的來自Menci,註釋是我自己加的啦(:з」∠)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章