30

配列があり、ユーザーは文字列を挿入できます。

そして、私はこのコードを持っています:

int main(){
  char anagrama[13];
  cin >> anagrama;
  for(int j = 0; j < strlen(anagrama); j++){
    cout << anagrama[j];
    for(int k = 0; k < strlen(anagrama); k++){
      if(j != k)
        cout << anagrama[k];
    }
    cout << endl;
  }
}

問題は、ソートされた順序で文字列のすべての順列が必要なことです。

たとえば、ユーザーが次のように書いた場合abc、出力は次のようになります。

abc
acb
bac
bca
cab
cba

私のコードはすべての順列を表示せず、ソートされていません

手伝って頂けますか?

関数を実装せずに実装する必要があります。

再帰関数で考えているのですが、やり方がわかりません。

これは例です: http://www.disfrutalasmatematicas.com/combinatoria/combinaciones-permutaciones-calculadora.html 繰り返しなしでソート

4

6 に答える 6

2

@alexanderこのプログラムの出力は、あなたが要求したとおりの順序になっています。

HERE は、いくつかの特別なライブラリを含めず ( iostream.h文字列のみが含まれる)、通常よりもいくつかの特別な名前空間を使用せずに (名前空間 stdのみが使用される) 、特定の配列のすべての組み合わせ/順列を生成するための最も単純なコードです。

void shuffle_string_algo( string ark )
{

//generating multi-dimentional array:

char** alpha = new char*[ark.length()];
for (int i = 0; i < ark.length(); i++)
    alpha[i] = new char[ark.length()];

//populating given string combinations over multi-dimentional array
for (int i = 0; i < ark.length(); i++)
    for (int j = 0; j < ark.length(); j++)
        for (int n = 0; n < ark.length(); n++)
            if( (j+n) <= 2 * (ark.length() -1) )
                if( i == j-n)
                    alpha[i][j] = ark[n];
                else if( (i-n)== j)
                    alpha[i][j] = ark[ ark.length() - n];

if(ark.length()>=2)
{
    for(int i=0; i<ark.length() ; i++)
    {
        char* shuffle_this_also = new char(ark.length());
        int j=0;
        //storing first digit in golobal array ma
        ma[v] = alpha[i][j];

        //getting the remaning string
        for (; j < ark.length(); j++)
            if( (j+1)<ark.length())
                shuffle_this_also[j] = alpha[i][j+1];
            else
                break;
        shuffle_this_also[j]='\0';

        //converting to string
        string send_this(shuffle_this_also);

        //checking if further combinations exist or not
        if(send_this.length()>=2)
        {
            //review the logic to get the working idea of v++ and v--
            v++;
            shuffle_string_algo( send_this);
            v--;
        }
        else
        {
            //if, further combinations are not possiable print these combinations 
            ma[v] = alpha[i][0];
            ma[++v] = alpha[i][1];
            ma[++v] = '\0';
            v=v-2;

            string disply(ma);
            cout<<++permutaioning<<":\t"<<disply<<endl;
        }
    }
}
}

そしてメイン

int main()
{
string a;
int ch;
do
{
    system("CLS");
    cout<<"PERMUNATING BY ARK's ALGORITH"<<endl;
    cout<<"Enter string: ";
    fflush(stdin);
    getline(cin, a);

    ma = new char[a.length()];

    shuffle_string_algo(a);

    cout<<"Do you want another Permutation?? (1/0): ";
    cin>>ch;
} while (ch!=0);

return 0;
}

望み!それはあなたを助けます!ロジックの理解に問題がある場合は、下にコメントしてください。編集します。

于 2014-08-02T15:17:28.000 に答える
1

テンプレートやコンテナでさえ、機能が実装されていないものを書きました。実際には最初は C で書かれていましたが、C++ に変換されています。

理解しやすいが効率が悪く、その出力はあなたが望むものであり、ソートされています。

#include <iostream>
#define N 4
using namespace std;

char ch[] = "abcd";

int func(int n) {
    int i,j;
    char temp;
    if(n==0) {
        for(j=N-1;j>=0;j--)
            cout<<ch[j];
        cout<<endl;
        return 0;
    }
    for(i=0;i<n;i++){
        temp = ch[i];
        for(j=i+1;j<n;j++)
            ch[j-1] = ch[j];
        ch[n-1] = temp;
        //shift
        func(n-1);
        for(j=n-1;j>i;j--)
            ch[j] = ch[j-1];
        ch[i] = temp;
        //and shift back agian
    }
    return 1;
}

int main(void)
{
    func(N);
    return 0;
}
于 2013-07-01T02:00:17.367 に答える