Permutacja w C++

0

Mam kod do perutacji zadanego ciagu (ponizej), jak podaje mu ilosc znakow do permutacji mniejsza niz 8 to kompilator sam dopisuje jakies dziwne znaki jak powyzej tej liczby to wszytko jest OK. Nie wiem dlaczego. Moglby ktos jeszcze zobaczyc czy obliczanie czasu dzialania programu jest dobrze zbobione.
Z gory dziakuje

[code]
#include<iostream>
#include<cstring>
#include <time.h>

using namespace std;
clock_t start, finish;

void char_permutation(char str[],char append[])
{
int length=strlen(str);
if(length)
{
double duration;
start = clock();
for(int i=0;i<length;++i)
{
char* str1=new char[length+1];
int cnt;
int cnt2;

                for(cnt=0,cnt2=0;cnt<length;++cnt,++cnt2)
                  {
                    if(cnt==i)
                    {
                       str1[cnt]=str[++cnt2];
                       continue;
                    }
                    else
                    str1[cnt]=str[cnt2];
                  }
                  str1[cnt]='\0';

                  int alength=strlen(append);
                  char* append1=new char [alength+2];
                  strncpy(append1,append,alength);
                  append1[alength]=str[i];
                  append1[alength+1]='\0';

                  char_permutation(str1,append1);

                  delete [] str1;
                  delete [] append1;
              }
            finish = clock();
          duration = (double)(finish - start) / CLOCKS_PER_SEC;
           }
   else
   {
     cout<<append<<endl;
    
   }

  }

int main()
{

int ile;

cout << "Podaj ile elementow chcesz permutowac? ";
cin >> ile;

char str[ile];
for (int i = 0; i < ile; i++){
cout << "Podaj znaki do permutacji: ";
cin >> str[i];
}

cout << "Tablica ma postac: \n";
for (int i = 0; i < ile; i++ ){
    
     cout << str[i];  
    }
    
cout << endl;

char append[]="\0";

char_permutation(str,append);

double duration;

cout << "Czas dzialania programu: " << duration << endl;

system("PAUSE");
return EXIT_SUCCESS;

}

[/code]

0

przy permutacji proponuje rekurencje

#include <iostream>
#include <iomanip>

using namespace std;
clock_t start, finish;

void perm(char *tab, int n, int x);
void writeln(char *tab, int n);
void zamien(char & a, char & b);
void time_perm(char *tab,int size);
     
int main()
{
    int size;
	char tab[size];
	cout<<"podaj ile ma byz znakow: ";
	cin>>size;cin.ignore();
	for(int i=0;i<size;i++){
            cout<<"podaj znak: ";
            cin>>tab[i]; cin.ignore();
            }
	time_perm(tab,size);
	
	getchar();
	return 0;
}

void writeln(char *tab, int n)
{
	for(int i=0; i<n; i++)
	{
		cout << setw(2) << tab[i];
	}
	cout << endl;
}

void zamien(char & a, char & b)
{
	char temp = a;
	a = b;
	b = temp;
}

void perm(char *tab, int n, int x)
{
	if(n == 0)
		writeln(tab,x);
	else
	{
		perm(tab,n-1,x);
		for (int i=0 ; i!=n-1; i++)
		{
			zamien(tab[i],tab[n-1]);
			perm(tab,n-1,x);
			zamien(tab[i],tab[n-1]);
		}
	}
}

void time_perm(char *tab,int size)
{
     double duration;
     start = clock();
     perm(tab,size,size);
     finish = clock();
     duration = (double)(finish - start) / CLOCKS_PER_SEC;
     cout<<duration;
}

//prostsze i przejrzystsze

0

Może uzyj next_permutation z STL:)
jeszcze prostsze

1 użytkowników online, w tym zalogowanych: 0, gości: 1