-5

文字列の順列を行うためのこのコードがあります。

#include <iostream> 
#include <string.h>
using namespace std;

/* Prototipo de función */
void Permutaciones(char *, int l=0); 
void sort(string scadena[]);
//array global to copy all permutations and later sort

string array[900000];
int m=0;
int main() {
int casos;
cin>>casos; 
char palabra[casos][13];
for(int i=0;i<casos;i++)
    cin>>palabra[i];

for(int i=0;i<casos;i++){
    m=0;
    Permutaciones(palabra[i]);
    sort(array);
}

  sort(array);
system("pause");
return 0;
}

void sort(string scadena[]){
string temp;

for(int i=0;i<m;i++){
    for(int j=i+1;j<m;j++){
        if(scadena[i]>scadena[j]){
            temp=scadena[i];
            scadena[i]=scadena[j];
            scadena[j]=temp;    
        }           
    }
}

for(int i=0;i<m;i++){
    for(int j=1;j<m;j++){
        if(scadena[i]==scadena[j] && j!=i){
            for(int k=j;k <m; k++){
                scadena[k]=scadena[k+1];
            }
            m--;
            j--;
        }

    }
}   
for(int i=0;i<m;i++){
    cout<<scadena[i]<<endl;
}   
}


void Permutaciones(char * cad, int l) {
char c;    /* variable auxiliar para intercambio */
int i, j;  /* variables para bucles */
int n = strlen(cad);

for(i = 0; i < n-l; i++) {
  if(n-l > 2){
    Permutaciones(cad, l+1);
  } 
  else {
        array[m]=cad;
        m++;            
  }
  /* Intercambio de posiciones */
  c = cad[l];
  cad[l] = cad[l+i+1];
  cad[l+i+1] = c;
  if(l+i == n-1) {
     for(j = l; j < n; j++){
        cad[j] = cad[j+1];
     } 
     cad[n] = 0;
  }
 }
}

そして、コードはすべての順列を正常に生成し、後で配列をソートして正常に動作します。しかし、繰り返される文字列を削除しようとすると、コードは何かが繰り返され、ソートされていないことを示しています。

誰が私のエラーを教えてくれますか?

4

2 に答える 2

1

標準ライブラリを使用すると、より簡単に実現できたはずです。

#include <algorithm>

using namespace std;

int main() {
    int a[] = {1, 2, 5, 6, 7};
    int n = 5;
    do {
// print array a
    } while (next_permutation(a, a + n));
}

タスクが自分で実装することでない限り。もちろん、この方法で配列を並べ替えようとする前に、配列が並べ替えられていることを確認してください。そうしないと、いくつかの並べ替えを見逃すことになります。

于 2013-07-02T03:13:45.107 に答える
0

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:28:11.907 に答える