C回溯生成数字123456789(1到9位数,全部不同)

时间:2015-12-14 17:28:45

标签: c numbers backtracking digits

我希望生成所有这些数字:

  • 1位数: 1,2,3,4,5,6,7,8,9 - (我知道有9个数字1 数字)

  • 2位数: 12,13..19然后21,23 ... 29 ....... 91,92,93,... 98(我知道 有9 * 8 = 72个2位数字)...

  • ...

  • 9位数: 123456789 .... 987654321(我知道有9个!数字9个 数字)所有数字彼此不同

我认为手动编写所有循环并不是一个好主意。所以我知道你最有可能不得不使用回溯方法,但我还没有使用它一段时间。

1 个答案:

答案 0 :(得分:0)

您希望使用 n = 9 生成所有k-permutations of n。问题Partial permutations对C ++有几个有用的答案。我将一个实现移植到C并根据您的需要进行调整:

#include <stdio.h>
#include <string.h>

void comb(char *rest, int n)
{
    static int sofar;
    static char sogood[10];
    if (n == 0)
        puts(sogood);
    else
        for (int i = 0; i < strlen(rest); i++)
        {
            sogood[sofar] = rest[i];
            char substring[10];
            strcpy(memcpy(substring, rest, i)+i, rest+i+1);
            ++sofar, comb(substring, n-1), --sofar;
        }
}

int main()
{
    for (int k = 1; k <= 9; ++k)
        comb("123456789", k);
}