0

いくつかの投稿を読んだ後、私はまだ順列と再帰関数に困惑しています。最初の文字がセット {'l', 'm', 'n'} からのもので、2 番目の文字がセット {'q ', 'r'} で、3 番目の文字はセット {'a', 'e', 'i', 'o'} からのものです。私のコードは正しい順列パターンを通過しますが、正しい出力が出力されません。たとえば、最初の 8 つの順列が次のようになっているとします。

lqa
lqe
lqi
lqo
lra
lre
lri
lro

私のコードは次のように出力されます:

lqa
e
i
o
ra
e
i
o

問題が何であるかについてのアイデアはありますか?これが私のコードの関連部分です:

rec(character_pools,0,3);
void rec(char** pool, int k, int j)
{
    if(k==j)
    {
        printf("\n");
        return;
    }
    int i,len=strlen(pool[k]);
    for (i=0;i<len;i++)
    {
        printf("%c",pool[k][i]);
        rec(pool,k+1,j);
    }
}
4

3 に答える 3

1

操作したい文字列を含む char 配列を作成します char str[] = "ABC";

次に、文字列の長さを取得し、int n = strlen(str);最後に並べ替えます。

入力文字列、文字列の開始インデックス、文字列の終了インデックスを含む新しい関数を作成します。開始インデックス ( int s) が終了インデックス ( ) と等しいかどうかを確認します。等しいint e場合は完了です。そうでない場合は、開始 (s) から終了 (e) に​​移動するループに入り、値を交換し、再帰します。 、再度スワップしてバックトラックします。

C++ での例:

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

void swap(char *i, char *j)
{
    char temp;
    temp = *i;
    *i = *j;
    *j = temp;
}

void permutate(char *str, int start, int end)
{
    int i;
    if (start == end)
        printf("%s\n", str);
    else
    {
        for (i = start; i <= end; i++)
        {
            swap((str + start), (str + i));
            permutate(str, start + 1, end);
            swap((str + start), (str + i)); //backtrack
        }
    }
}

int main()
{
    char str[] = "ABC";
    int n = strlen(str);
    permutate(str, 0, n - 1);
    return 0;
}
于 2016-01-02T15:02:30.853 に答える
1

これは私のために働いた!ヒントは@Tsukuyoさん。順列で文字列の n 番目のインデックスを見つけたい場合、別の質問をする必要がありますか?

void rec(char** pool, int k, int j, char* cur, int counter)
{
    if(k==j)
    {
        cur[k]=0;
        printf("Recursive call #%d %s\n",counter,cur);
        return;
    }
    int i,len=strlen(pool[k]);


    for (i=0;i<len;i++)
    {
        cur[k]=pool[k][i];
        rec(pool,k+1,j,cur,counter++);
    }
}
于 2013-09-21T16:12:09.797 に答える