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 回答