Formel für Maximale Zahlenkombinationen

Hallo!

Ich suche nun schon einige Tage im web nach einer Lösung meines Problems:

Ich habe die Zahlen 1 bis 10 (1,2,3,4,5,6,7,8,9,10), nun möchte ich herausfinden wie viele Möglichkeiten es gibt Kombinationen zu bilden bei denen von einer zur nächsten Ziffer die max Differenz 4 nicht überschritten wird
z.B.:
1,4,8,10,9,7,6,5,3,2
oder
1,3,6,10,9,7,4,8,5,2
oder
1,3,2,4,6,9,10,8,7,5
oder
1,4,6,8,7,10,9,5,3,2

usw...

wichtig ist das wenn man bei der letzten Zahl angekommen ist, wieder von vorn anfangen kann und die max Differenz von 4 nicht überschritten wird
z.B.:
1,3,2,4,6,9,10,8,7,5

währe dann 5,1,3,2,4,6,9,10,8,7

Wie müsste dazu die Formel aussehen?
Vielen Dank schon mal!

powerfisch
 
ich versteh dich jetzt nicht ganz aber ich fang einfach mal an :)

wie lang ist deine zahlenkette ? exakt 10 stellen ?

für die erste stelle ist jede zahl von 1-10 möglich(also 10 zahlen): fallunterscheidung:

1.1 für ziffer 5 oder 6 gibt es für die folgestelle 9 möglichkeiten (4 drunter, 4 drüber, exakt die gleiche zahl)
1.2 für ziffer 4 und 7 gibt es 8 nachfolgestelle (3 bzw 4 drunter, 4 bzw 3 drüber, exakt die gleiche zahl) - rest analog
1.3 ziffer 3 und 8: 7 folgemöglichkeiten
1.4 ziffer 2 und 9: 6 folgemöglichkeiten
1.5 ziffer1 und 10: 5 folgemöglichkeiten

(das ganze läst sich auch als negativ betrachten - also 10^10 / x, wobei x = nicht mögliche folgekombinationen).

so, das war jetzt bruteforcing :)

/edit: dürfen sich die zahlen widerholen ? kumpel hat mich grade drauf hingewiesen
 
Original von t3rr0r.bYt3
wie lang ist deine zahlenkette ? exakt 10 stellen ?

Ja genau 10 stellen.

Original von t3rr0r.bYt3
/edit: dürfen sich die zahlen widerholen ? kumpel hat mich grade drauf hingewiesen

hmmm, verstehe die Frage nicht richtig Kombinationen dürfen sich nicht wiederholen jedoch wird es vorkommen das sich Zahlen an den einzelnen Positionen wiederholen.

Ich habe hier schon ne Endlosschleife mit vb gabastelt nur leider möchte ich Igendwie Überprüfen ob alle Kombinationen schon gefunden wurden und deshalb hatte ich nach einer Berechnungsmöglichkleit gesucht.

#offtopic#
Ich bin nun bis Freitag unterwegs also nicht wundern wenn ich hir erst mal nicht mehr Antworte.

powerfisch
 
wenn die Anzahl der Zahlen n ist rechnest du n! (Ziehen ohne Zurücklegen, dh. wenn eine Zahl schon mal dran war, wird sie in der selben Kombination nicht mehr vorkommen). Wenn sich die Zahlen wiederholendürfen, dann n^n (1. Stelle hat z.B. 10 Mgl., die 2. wieder, die 3. wieder 10 usw).

mfg
Serow
 
@serow: das beachtet aber die vorraussetzung mit der maximalen differenz von 4 nicht. das sind simple maximal-kombinationen. wenn man leichet(er) ausrechnen kann, wieviele "illegale" kombinationen es gibt (also wo die differenz >4), dann teilt man 10! durch die anzahl der illegalen kombinationen.

@powerfisch

sry, ich war wohl gestern echt zu müde, das zu checken. als ich mir das im bett durch den kopf gingen ließ, hab ichs dann schon ein weniger mehr geplant..
ich hab das gestern ein wenig überflogen, aber für den fall, dass sich die zahlen innerhalb einer kette wiederholen dürfen.

poste mal bitte deinen vb-code, das wäre sehr nützlich.
 
Ok, hier erst mal der Code der mit die Kombinationen generiert, möchte aber gleich dazu sagen das ich Proggen nicht gelernt habe.

Code:
schondrin = False
maxsprung = 4

uhngültig:
'###- Hier habe ich die Durchläufe erst einmal begrenzt -###'
If d > 100000 Then GoTo ende
d = d + 1

'###- Festlegen das jede Kombination mit 1 beginnt -###'
ergebnis1 = 1

nochmal:
    zufalszahl = Int((10 - 1 + 1) * Rnd + 1)

'###- Überprüfen ob die Zufalszahl bereits in der Kombination enthalten ist -###'    
    zahlreihe = Split(ergebnis1, ",")
    For a = 0 To UBound(zahlreihe)
        If Int(zahlreihe(a)) = zufalszahl Then
            schondrin = True
            Exit For
        Else
            schondrin = False
        End If
    Next a
'###- Wenn die Zahl noch nicht enthalten ist der Kombination hinzufügen -###'
    If schondrin = False Then
        ergebnis1 = ergebnis1 & "," & zufalszahl
    End If

'###- Überprüfen ob die Kombination schon alle Zahlen enhält -###'
    If UBound(zahlreihe) + 1 >= 10 Then
        GoTo weiter
    Else
        GoTo nochmal
    End If
weiter:

'###- Überprüfen ob der Sprung von max. 4 gegeben ist -###'
    For b = 0 To UBound(zahlreihe)
        If b = UBound(zahlreihe) Then
            If Not Abs(zahlreihe(0) - zahlreihe(b)) <= maxsprung Then GoTo uhngültig
            Exit For
        End If
        If Not Abs(zahlreihe(b) - zahlreihe(b + 1)) <= maxsprung Then GoTo uhngültig
    Next b

'###- Überprüfen ob die Kombination schon einmal ermittelt wurde -###' 
    If ergebnis2 Like "*" & ergebnis1 & "*" Then
        GoTo uhngültig
    Else
        If ergebnis2 = "" Then
            ergebnis2 = ergebnis2 & ergebnis1
        Else
            ergebnis2 = ergebnis2 & ";" & ergebnis1
        End If
        GoTo uhngültig
    End If

ende:

loesungen = Split(ergebnis2, ";")
Text6.Text = UBound(loesungen) + 1
Text6.Refresh
For a = 0 To UBound(loesungen)
    List1.AddItem loesungen(a)
Next a

Ich hoffe es ist ersichtlich wie es abläuft.

powerfisch

Keiner ne Idee ???
 
Zurück
Oben