Alle Permutationen ausgeben
-
Habe ein kleines Programm geschreiben, welches alle Permutationen eines int array ausgeben sollte. Das klappt auch bis 3 Array-Elemente, ab dann werden nur noch die Hälfte der Permutationen ausgegeben, dafür doppelt. Erkennt jemand den(die) Fehler?
#include <iostream> using namespace std; const int ANZ=4; int faculty(int n) { if(n==0) { return 1; } else { int value=1; for(n;n>0;n--) { value*=n; } return value; } } int* algo(int* a) { int l; for(int i=0; i<faculty(ANZ);i++) { l=a[(i%ANZ)]; a[(i%ANZ)]=a[(i+1)%ANZ]; a[(i+1)%ANZ]=l; cout << "Permutation " << i+1 << ": "; for(int j=0;j<ANZ;j++) { cout <<a[j]; } cout << endl; } return 0; } int main() { int a[ANZ]; for (int i=0; i<ANZ;i++) { a[i]=i; } algo(a); return 0; }
Danke Gruss cof
-
ich habe zwar keine lösung für dein problem, aber vielleicht interessiert dich next_permutation aus der stl.
-
ich weiss jetzt zwar nicht was permutations sind
, aber bei mir kommt nichts doppelt raus sondern das:
Permutation 1: 1023
Permutation 2: 1203
Permutation 3: 1230
Permutation 4: 0231
Permutation 5: 2031
Permutation 6: 2301
Permutation 7: 2310
Permutation 8: 0312
Permutation 9: 3012
Permutation 10: 3102
Permutation 11: 3120
Permutation 12: 0123
Permutation 13: 1023
Permutation 14: 1203
Permutation 15: 1230
Permutation 16: 0231
Permutation 17: 2031
Permutation 18: 2301
Permutation 19: 2310
Permutation 20: 0312
Permutation 21: 3012
Permutation 22: 3102
Permutation 23: 3120
Permutation 24: 0123wenn das beabsichtigt war, dann sag mal welchen compiler du benutzt oder versuch mal meine version, die ich umgeschrieben habe ( aufgemotzt
):
#include <iostream> #include <fstream> inline int fac ( const int n ) { return n < 2 ? 1 : n * fac ( n - 1 ); }; template<class T> void permutation ( T* array, const std::size_t size, std::ostream& out = std::cout ) { for ( int i = 0; i < fac ( size ); ) { T t = array[( i % size )]; array[( i % size )] = array[( i + 1 ) % size]; array[( i + 1 ) % size] = t; out << "Permutation " << ++i << ":\t"; for ( int j = 0; j < size; ) out << array[j++]; out << std::endl; } }; int main() { char* a[4] = { "0", "1", "2", "3" }; std::fstream outputFile ( "permutation.txt", std::ios::out ); permutation ( a, 4 ); permutation ( a, 4, outputFile ); std::cin.clear (); std::cin.ignore ( std::cin.rdbuf () -> in_avail () ); std::cin.get (); return 0; }
was auch immer
-
danke erst mal für deine Mühen.
Allerdings hat deine Ausgabe auch doppelte Ausgaben. z.B Permutation 24 und 12 erzeugen beide 0123.
Eine Permutation ist eine andere Anordung der Elemente.
bei 3 Elementen wäre es:
123
132
321
312
231
213bei 4 elementen sind es 4! Anordungen also 24.
Habe deinen Code noch nicht angeschaut, kommt aber noch
-
std::next_permutation hat dich wirklich nicht weitergebracht
Was störte dich denn dabei?
-
ich glaub vielleicht versteh ich jetzt. aender mal folgende zeile :
for ( int i = 0; i < fac ( size ) / 2; ) //da ab der haelfte alle permutations wiederhohlt werden
was auch immer
-
@helium: ehrlich gesagt, habe ich das noch nicht angesehen, möchte denn algorithmus man selbst finden.
@was auch immer: es gibt aber fac(size) pernutationen. er gibt einfach nur die haelfte aus, diese dafür doppelt. dh es fehlen 50% der Permutationen.gruss cof
-
Wahrum nicht rekursive Funktione benutzen? Oder std::stack? Oder sogar deine eigene Stack Implementierung?
-
habe mir überlegt ob ichs rekursiv machen soll, bin aber nicht auf eine vernünftige Überlegung gestossen.
Wenn ich einen Stack brauchen würde, müsste ich die Permutationen schon alle kennen um diese auf den stack zu pushen, allerdings rechnet der Algorithmus nicht alle aus, dh der Algo ist falsch.
-
include <iostream> #include <algorithm> void permut (int arr[], int n, int * prev, int start = 0) { if (n <= start) { for (int i = 0; i < n; i++) { cout<<prev[i]<<" "; } cout<<endl; return; } for (int i = start; i < n; i++) { prev[start] = arr[i]; swap (arr[i], arr[start]); permut (arr, n, prev, start + 1); swap (arr[i], arr[start]); } } int main (void) { const int sz = 3; int arr[sz], prev[sz]; for (int i = 0; i < sz; i++) arr[i] = i; permut (&arr[0], sz, &prev[0]); return 0; }
-
kann man auch ohne pointer diese Beispiel lösen?