0

入力数値から他の数値のすべての順列を返す単純な順列プログラムを作成しようとしています。

私がした場合:

{0,1,2,3,4,5,6,7}

そして、入力番号 3 として、指定された番号を除くすべての番号の順列をすべて取得したいと考えています。リストの順序は気にしません。最初の番号が入力番号であることだけを気にします。

{3,0,1,2,4,5,6,7}
{3,1,2,4,5,6,7,0}
{3,2,4,5,6,7,0,1}
... etc

すべての順列を提供するこのソリューションを試しましたが、1から始まり、「目的の最初の番号」の順列を表示し終わったときに停止する方法がわかりません。残りのものは気にしません。私が行っている別のことのインデックスを使用して出力を処理することも素晴らしいでしょう。何か案は?ありがとう。

4

1 に答える 1

1

入力番号を引数としてこのプログラムを実行します。

#include <stdio.h>

char a[] = {0,1,2,3,4,5,6,7}, x;
#define SWAP(i, j)  x = a[i], a[i] = a[j], a[j] = x

void print()
{
    int i;
    char c = '{';
    for (i = 0; i < sizeof a; c = ',') printf("%c%d", c, a[i++]);
    puts("}");
}

void perm(int j)
{
    int i = j-1, k;
    if (i <= 0) { print(); return; }

    perm(i);
    for (; i; --i)
    {
        for (k = j; k > i; --k)
            if (a[i] == a[k]) break;
        if (k > i) continue;

        SWAP(i, j);
        perm(j-1);
        SWAP(i, j);
    }
}

int main(int argc, char *argv[])
{
    int i;
    if (argc != 2) return 1;

    i = atoi(argv[1]);
    SWAP(i, 0);
    perm(sizeof a - 1);
    return 0;
}
于 2013-05-27T12:00:07.073 に答える