C語言作業|全排列(升序)

Description

輸入一個整數 n(1 <= n <= 8), 輸出1,2,3...n 的全排列

Input

3

Output

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

Hint

輸出的順序按第一個數從小到大排列,若第一個數相同,則按第二個數排列,以此類推。使用遞歸


法一:

#include <stdio.h>

int n;
int ary[9];

void swapAry(int x, int y);
void printAry();
void sortAry(int from, int to);
void func(int from, int to);
void store(int to[], int from[]);

int main(int argc, char const *argv[])
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++ i)
    {
        ary[i] = i;
    }
    func(1, n);

    return 0;
}

void swapAry(int x, int y)
{
    int temp = ary[x];
    ary[x] = ary[y];
    ary[y] = temp;
}

void printAry()
{
    for (int i = 1; i < n; ++ i)
    {
        printf("%d ", ary[i]);
    }
    printf("%d\n", ary[n]);
}

void sortAry(int from, int to)
{
    int allRight;
    for (int i = from; i < to; ++ i)
    {
        allRight = 1;
        for (int j = from; j < to + from - i; ++ j)
        {
            if (ary[j] > ary[j + 1])
            {
                swapAry(j, j + 1);
                allRight = 0;
            }
        }
        if (allRight)
            break;
    }
}

void store(int to[], int from[])
{
    for (int i = 1; i <= n; ++ i)
        to[i] = from[i];
}

void func(int from, int to)
{
    if (from == to)
    {
        printAry();
    }
    else
    {
        sortAry(from, to);

        for (int i = from; i <= to; ++ i)
        {
            int temp[9];
            store(temp, ary);
            swapAry(i, from);
            func(from + 1, to);
            store(ary, temp);
        }
    }
}
法二:
#include <stdio.h>

int ary[9];
int n;

int next();

int main(int argc, char const *argv[])
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++ i)
    {
        ary[i] = i;
    }

    do
    {
        for (int i = 1; i < n; ++ i)
            printf("%d ", ary[i]);
        printf("%d\n", ary[n]);
    } while(next());

    return 0;
}

int next()
{
    for (int i = n; i > 1; -- i)
    {
        if (ary[i - 1] < ary[i])
        {
            int min = i;
            for (int j = i + 1; j <= n; ++ j)
            {
                if (ary[j] > ary[i - 1])
                    min = j;
                else
                    break;
            }
            int temp = ary[min];
            ary[min] = ary[i - 1];
            ary[i - 1] = temp;
            for (int j = i, k = n; j < k; ++ j, -- k)
            {
                temp = ary[j];
                ary[j] = ary[k];
                ary[k] = temp;
            }

            return 1;
        }
    }
    return 0;
}


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