Cześć, napisałem krótki program generujący wszystkie permutacje zbioru liczb podanego przez użytkownika. Program zwraca dobrą liczbę permutacji tj. dla liczności zbioru n, jest n! permutacji. Problem w tym, że zamiast liczb naturalnych zwraca ujemne albo śmieci z pamięci. Nie mogę zlokalizować przecieku. Jestem początkującym programistą... Pewnie ktoś doświadczony zauważy błąd od razu ;p
#include <iostream>
#include <string>
#include <list>
#include <fstream>
#include <cstddef>
#include <cstdlib>
#include <iterator>
#include <algorithm>
using namespace std;
void permutacja_(int k, int n, int tab[])
{
if(k==1)
{
for(int i=0; i<n; i++)
{
cout << tab[i] << " ";
}
cout << endl;
}
else{
for(int i=0; i<k; i++)
{
//cout << k << " ";
//cout << n << " ";
swap(tab[i],tab[k]);
permutacja_(k-1, n, tab);
swap(tab[i],tab[k]);
}
}
}
int main()
{
int n=0, k=0;
int tab[10];
cin >> n;
k = n;
for(int i=0; i<n; i++)
{
cin >> tab[i];
}
permutacja_(k, n, tab);
return 0;
}
Dla instancji n=2
{1,2}
powinno być
1 2
2 1
a program zwraca:
-667167374 2
1 -667167374
:(
***okeej znalazłem błąd ;p przykładowo k=2,a nie istnieje tab[2] dla tablicy dwuelementowej, ponieważ jest numerowana od 0 a nie od 1 ;p ale naradził się kolejny problem, program nie generuje wszystkich permutacji ;/
***idąc za ciosem... oczywiscie jak numerujemy od 0 no to k==0 a nie k==1 ;p teraz z kolei mam powtórki w permutacjach... dla n=3 jest 9 a nie 6... poprawiam dalej ;p
***ok, solved zamiast n w pętli powinno być k+1
przepraszam za zamieszanie, prosiłbym jednak o nie usuwanie tematu, myślę że przyda się jeszcze jakiemu beginnerowi jak ja ;p
wklejam poprawny kod:
#include <iostream>
#include <string>
#include <list>
#include <fstream>
#include <cstddef>
#include <cstdlib>
#include <iterator>
#include <algorithm>
using namespace std;
void permutacja_(int k, int n, int tab[])
{
if(k==0)
{
for(int i=0; i<n; i++)
{
//cout << n << endl;
cout << tab[i] << " ";
}
cout << endl;
}
else{
//cout << k << endl;
for(int i=0; i<k+1; i++)
{
//cout << k << " " << "k"<< endl;
//cout << n << " ";
//cout << tab[i] << " ";
//cout << tab[k] <<"tab[k]" <<endl;
swap(tab[i],tab[k]);
permutacja_(k-1, n, tab);
swap(tab[i],tab[k]);
}
}
}
int main()
{
int n=0, k=0;
int tab[10];
cin >> n;
k = n-1;
for(int i=0; i<n; i++)
{
cin >> tab[i];
}
permutacja_(k, n, tab);
return 0;
}