Hallo,
da ich durch C nicht durchblicke, hier noch ein Versuch durch Tauschen der Stellen in der Richtung wie Manf vorgeschlagen hat ?
Code:
$regfile = "attiny45.dat"
$framesize = 32
$swstack = 32
$hwstack = 36
$crystal = 8000000
Const Max_positionen = 4 'Anzahl Stellen
Const Max_pos_decr = Max_positionen - 1 'Hilfskonstante
Dim Zahl(max_positionen) As Byte 'enthält jeweilige Kombination
Dim Roll_pos(max_positionen) As Byte 'Hilfsvariable für Rollpositionen
Dim Zahl_str As String * Max_positionen 'variable für Ausgabe der Kombination
Dim Ab_stelle As Byte 'Übergabevariable in Sub "rollen"
Dim I As Byte , Zw1 As Byte , Zw2 As Byte
Dim Moeglichkeit_nr As Long 'zählt gefundene Möglichkeiten durch
Defbyte S 'Noch nicht decl. Variablen beg. mit S as byte
Declare Sub Rollen(ab_stelle As Byte)
Declare Sub Ausgabe
'####################
'Beginn Hauptprogramm
Moeglichkeit_nr = 0
For I = 1 To Max_positionen
Zahl(i) = I - 1
Roll_pos(i) = Max_positionen - I
Next I
'Zahlarray mit maximal 10 Stellen mit Ziffern 0..9
'links ist Stelle 10 - ST10 , rechts ist Stelle 1 - ST1
'läuft mit 4 Stellen
'zum Erweitern Kommentare entfernen UND Konstante Max_positionen anpassen
'For St10 = 1 To 10
' For St9 = 1 To 9
' For St8 = 1 To 8
' For St7 = 1 To 7
' For St6 = 1 To 6
' For St5 = 1 To 5
For St4 = 1 To 4
For St3 = 1 To 3
For St2 = 1 To 2
For St1 = 1 To 1
Ausgabe
Next St1
Rollen Roll_pos(1)
Next St2
Rollen Roll_pos(2)
Next St3
Rollen Roll_pos(3)
Next St4
' Rollen Roll_pos(4)
' Next St5
' Rollen Roll_pos(5)
' Next St6
' Rollen Roll_pos(6)
' Next St7
' Rollen Roll_pos(7)
' Next St8
' Rollen Roll_pos(8)
' Next St9
' Rollen Roll_pos(9)
'Next St10
End 'end program
'##########
'Beginn Unterprogrammdefinitionen
Sub Rollen(ab_stelle As Byte) 'links rollen um 1 der rechten Stellen in "Zahl" ab "ab_stelle"
Zw1 = Zahl(ab_stelle)
For I = Ab_stelle To Max_pos_decr
Zw2 = I + 1
Zahl(i) = Zahl(zw2)
Next
Zahl(max_positionen) = Zw1
End Sub
Sub Ausgabe
Incr Moeglichkeit_nr 'Wieder eine Möglichkeit mehr zur Ausgabe
'Hier eigene Ausgabeanweisungen rein
'zb Print
Zahl_str = ""
For I = 1 To Max_positionen
Zahl_str = Zahl_str + Str(zahl(i)) 'Kombination im Zahl array in String geben
Next I
End Sub
Algorithmus ist mit Turbo Pascal ausprobiert, Bascom Prg aber nur bis 4 Stellen im Simulator getestet.
EDIT: Etwas spät, aber ich möchte die Arbeitsweise vom Programm noch etwas erklären:
Das Array "Zahl" enthält soviele Elemente, wie verschiedene Elemente vorhanden sind, von denen Permutationen gebildet werden sollen. In diesem Fall 10 für die Zahlen 0 bis 9.
Das Array wird dann mit den Zahlen 0..9 gefüllt. Möglich sind auch Buchstaben oder sonstwas, wenn es dem Arraytyp entspricht bzw der Arraytyp angepaßt wird.
Danach läuft das Programm in die For-To Schleifen und landet bei "Ausgabe" -> es wird die Initialisierung von "Zahl" als erste Möglichkeit ausgegeben.
Nach der Ausgabe wird der Inhalt nur der beiden letzten Arrayelemente nach links gerollt (was für die beiden ein Austausch bedeutet.)
Das wird dann als nächste Möglichkeit wieder zur Ausgabe gebracht und die letzten beiden Arrayelementinhalte wieder getauscht, was zum Initialisierungszustand zurückführt.
Nun ist ST2 aber erfüllt und ein Rollen von 3 Elementen ab dem drittletzten Element findet statt und danach ausgegeben.
Die letzten beiden Elemente werden wieder gerollt und ausgegeben, weiter wie oben.
Das findet für ST3 drei Mal statt - Initialisierungszustand wieder erreicht, der nicht ausgegeben wird - ab viertletztem Element gerollt - Ausgabe
...und so weiter.
Gruß
Searcher
Lesezeichen