Hallo.
Ich hab gerade eine Aufgabe, und zwar, dass ich eine Rekursion zum Puzzle "Noch Verzwickter!" von Uli Stein von Visual Quick Basic umschreiben soll in C#.
Sooo . . . nun Folgendes:
Ich bin jetzt quasi am Ende meiner Übersetzung, nur gibt es einen kleinen Schönheitsfehler, und zwar:
Ich möchte, dass er alle Möglichkeiten der Kartenlegung durchprobiert, bis er irgendwann die umgekehrte Anfangsreihenfolge hat.
Also:
Aus 123456789
soll später 987654321 werden.
Jetzt hatte ich das versucht, indem ich immer die letzte Zahl nehme, und die weiter nach vorn schiebe.
Nun kamen aber immer nur die 1 und die 9 an den Anfang. Also probierte er nicht alles aus.
Ich möchte also jede einzelne kleine Möglichkeit erfassen und die durchspielen lassen.
Habt ihr eine Idee, wie ich das in C# schreiben kann?
Folgendes soll dabei herauskommen, nur ich kenn den Code dafür nicht:
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 9 8 7
1 2 3 4 5 7 6 8 9
1 2 3 4 5 7 6 9 8
Er soll halt mit den vorhandenen Zahlen (in diesem Fall Karten) - jede nur EINMAL - einfach nur hochzählen. Und wenn er beim nächsten Tausender angekommen ist, dann soll er die nächste Zahl mit einbeziehen, etc.
Ich denke die Gesetzmäßigkeit dahinter habt ihr verstanden, oder?
Nun habe ich es leider immernoch nicht herausgefunden, wie ich es schreiben soll . . . habe mir zwar Gedanken gemacht, hat aber nicht viel gebracht. Ich weiß jetzt, dass ich die Lexikographische Ordnung aufschreiben muss, weiß jedoch nicht wie. Bei mir steht momentan:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| do { Console.SetCursorPosition(0, 0); Console.WriteLine("Alte Reihenfolge: " + reiheString); Console.WriteLine("Suche neue Reihenfolge . . . bitte warten . . .");
for (x = 8; x >= 1; x--) { if (int.Parse(reiheString.Substring(x, 1)) > int.Parse(reiheString.Substring(x - 1, 1))) { n = x - 1; x = 0; } }
nString = reiheString.Substring(n, 1); z = -1; sString = "";
do { z++; if (z >= 9) { return; } sString = reiheString.Substring(int.Parse(nString) + z, 1); s = reiheString.IndexOf(sString, n + 1); } while (s == -1);
for (x = 0; x < 9; x++) { rxString[x] = reiheString[x]; }
Swap(ref rxString, n, s);
reiheString = reiheString.Substring(0, n) + sString;
for (x = 0; x < 9; x++) { for (y = n+1; y < 9; y++) { if (rxString[y] == (char)(49 + x)) { reiheString = reiheString + rxString[y]; } } }
anzahlInt = anzahlInt + 1;
for (x = 0; x < 9; x++) { r = int.Parse(reiheString.Substring(x, 1)); for (b = 0; b < 5; b++) { kString[x, b] = dString[r - 1, b]; } }
Display(kString); if (Dreh(ref kString)) { Display(kString); Console.ReadKey(); } } } while (reiheString != "987654321"); } |
So jetzt gibt es ein Programm, in dem alle Möglichkeiten aufgelistet werden:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| class Program { private static void swap(char[] a, int iPos1, int iPos2) { char c = a[iPos1]; a[iPos1] = a[iPos2]; a[iPos2] = c; }
static Boolean get_next(char[] a) { int i = a.Length - 1;
while (a[i - 1] >= a[i]) { i = i - 1; if (i == 0) return false; }
int j = a.Length;
while (a[j - 1] <= a[i - 1]) j = j - 1;
swap(a, i - 1, j - 1);
i++; j = a.Length;
while (i < j) { swap(a, i - 1, j - 1); i++; j--; } return true; }
static void Main(string[] args) { char[] a = "123456789".ToCharArray(); do { System.Console.Out.WriteLine(a); } while (get_next(a)); } } |
Nur bekomm ich das nicht IN meine Funktion!
Moderiert von
Christian S.: C#-Tags hinzugefügt