【问题标题】:Permutation of 0..7 in CC 中 0..7 的排列
【发布时间】:2013-05-27 09:24:19
【问题描述】:

我正在尝试制作一个简单的排列程序,它从输入的数字返回给我其他数字的所有排列。

如果我有:

{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

我试过this solution,它给出了所有排列,但它从 1 开始,当我完成显示“所需的第一个数字”的排列时我不知道如何停止它,因为我不在乎其余的那些。为我正在做的另一件事处理带有索引的输出也很棒。有任何想法吗?谢谢。

【问题讨论】:

  • 一个不太优雅的解决方案是从数组中删除数字,显示所有其他数字的排列并将该数字添加到所有这些解决方案中。

标签: c permutation


【解决方案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;
}

【讨论】:

  • 您的答案看起来不错,但是我在尝试使用输入数字作为参数执行程序时遇到问题。您是否有机会稍微更改代码,以便我可以直接在主函数中输入所需的数字?我为此尝试的是输入i = 5;(例如),但它不起作用。提前致谢!
  • 好吧,你当然可以把i = atoi(argv[1])改成i = 5;也许你只是忘了删除if (argc != 2) return 1;这一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多