2013-07-02 27 views
-5

我有這段代碼來做一個字符串的排列。在C++中的字符串數組的排列

#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; 
    } 
} 
} 

而且代碼生成的所有排列都很好,後來對數組進行了排序並且工作正常。但是當我意圖刪除重複的字符串時,代碼會向我顯示重複的一些事情,而不是排序。

誰能說我什麼是我的錯誤?

+2

使用調試器或類似的東西,逐行執行代碼。無論如何,這是一個很好的練習。 – jogojapan

+0

Iam農業工程師,我不知道調試器 –

+0

我強烈建議你** a)**總是使用英文標識符,或者至少** b)**在發佈到英文網站之前翻譯。遲早,非西班牙人將需要閱讀你的代碼。像現在。 – Lstor

回答

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)); 
} 

除非任務是落實它自己。當然,在你嘗試以這種方式進行排列之前,確保你的數組已經排序,否則你會錯過一些排列。

+4

+1。不過,我會使用'std :: vector'並且會跳過'using'。 – Lstor

0

在這裏,是用於生成所有組合的最簡單的代碼/給定陣列的排列,而不包括一些特殊的庫(僅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; 
} 

希望!它可以幫助你!如果您在理解邏輯時遇到問題,請在下面評論,我會進行編輯。