Sudoku regiert
In Sudoku-Spielen bildet das klassische neun-Käfig-Gitter aus 9 × 9 = 81 Zellen und bildet auch 3 × 3 = 9 kleine Neun-Käfig-Gitter. Es ist erforderlich, die Zahlen 1 ~ 9 in 81 kleinen Zellen auszufüllen, und die Zahlen können nicht in jeder Zeile, in jeder Säule und in jedem kleinen Neun-Käfig-Gitter wiederholt werden.
Sudoku -Fähigkeiten
Meine Gedanken
Entwurf und Implementierung von Lösungen
Es wird nur ein zweidimensionales Array verwendet, um das Sudoku-Schema zu speichern, ein eindimensionales Array wird als Stapel verwendet, und eine boolesche Variable wird als Backtrack-Identifizierung verwendet.
1. Variable Definition:
var problem = [ //This is the question of difficulty 10.7 mentioned in the book [8,0,0,0,0,0,0,0,0], [0,0,3,6,0,0,0,0,0,0], [0,7,0,0,9,0,2,0,0], [0,5,0,0,0,7,0,0,0,0,0,0], [0,0,0,0,0,4,5,7,0,0,0], [0,0,0,1,0,0,0,0,3,0], [0,0,1,0,0,0,0,0,6,8], [0,0,8,5,0,0,0,0,1,0], [0,9,0,0,0,0,0,0,4,0,0,0]] var Stack = [], Flag = false;
2. Bestimmung der Wirksamkeit des Plans:
Das Hashing -Merkmal von JavaScript -Objekten wird voll genutzt. Um das Debuggen zu erleichtern, beträgt der Rückgabewert der Funktion 0, wenn sie gültig ist, und es gibt drei Situationen, in denen sie ungültig ist: Zeilenkonflikt, Spaltenkonflikt und neunteiliger Gitterkonflikt, die 1, 2 und 3 zurückgeben. Ich habe es im frühen Urteil verwendet und später das relevante Urteil von 20 Frames hinzugefügt. Diese Funktion wird bei der Suche nach der Antwort nicht mehr verwendet.
Funktion checkvalid (sudo) {lass subsudo = {} // Hilfsvariable verwendet, um zu bestimmen, ob die neunten Gitterkonflikte für (let i = 0; i <9; i ++) {let row = {}, col = {} // Auxiliary -Variable verwendet, um zu bestimmen, ob Strecken und Spaltenkonflikte für (let j = 0; sudo [i] [j], cur2 = sudo [j] [i] // autorisierte Variable abgeschlossene Zeile und Spaltenbeurteilung gleichzeitig, wenn (Zeile [cur1]) // das aktuelle Element in der Zeile angezeigt wurde und das Urteil von Null optimiert ist. Wenn der Schlüssel 0 ist, ist der Wert 0, ist kein zusätzliches Urteil erforderlich. Rückkehr 1; // Fehlercode zurücksenden CODE EINWEISE Zeile [cur1] = cur1 // Das aktuelle Element wird in der Zeile nicht angezeigt und wird in der Hilfsvariable gespeichert, wenn (col [cur2]) // Das Urteil der Spalte ähnelt der Zeile. Das Urteil von Null ist optimiert. Wenn der Schlüssel 0 ist, beträgt der Wert 0 und es besteht kein zusätzliches Urteilsvermögen. Rückkehr 2; sonst col [cur2] = cur2; Sei Key = math.floor (i/3)+'-'+math.floor (j/3) // Die verschiedenen Tasten werden für verschiedene neun-Client-Netze generiert, wenn (subudo [key]) {// Das Urteil von Null ist bereits da und das Urteil von Null ist optimiert. Wenn der Schlüssel 0 ist, beträgt der Wert 0, und es besteht kein zusätzliches Urteil, wenn (Subsudo [Schlüssel] [cur1]) // das Urteil eines neunklienten Gitters ähnlich dem von Zeile gibt 3 sonst 3 sonst Subudo [Key] [cur1] = cur1} else {// Dies ist das erste Element, das das erste Element in einem kleinen neun-tägigen GRID-Subsudo-Save-Save-Save-Save-Save-Save-Save-Save-. Das erste Element in IT subsudo [Schlüssel] [cur1] = cur1}}} return 0; // Das Programm kann dies ausführen, was darauf hinweist, dass der Plan gültig ist} 3. Relevante zwanzig Kategorienbestimmung Das Prinzip entspricht dem Gesamturteil, und das Highlight liegt in der Positionierung des kleinen neun-Käfig-Netzes. function check20Grid(sudo,i,j){ let row = {}, col = {}, subSudo = {} //Supply variable for(let k = 0; k < 9; k++){ let cur1 = sudo[i][k], cur2 = sudo[k][j] if(cur1){ //The current element has appeared in the row, and the judgment of zero is optimized. Wenn der Schlüssel 0 ist, beträgt der Wert 0, und es besteht kein zusätzliches Urteilsvermögen, wenn (Zeile [cur1]) Rückgabe 1; // Fehlercode zurücksenden CODE EINWEISE Zeile [cur1] = cur1 // Das aktuelle Element wird in der Zeile nicht angezeigt und wird in der Hilfsvariablen gespeichert} if (cur2) {// Das Urteil der Spalte ähnelt der Zeile. Das Urteil über Nullverlust ist optimiert. Der Wert ist 0, wenn der Schlüssel 0 ist. Es ist kein zusätzliches Urteil erforderlich, wenn (col [cur2]) zurücks 2; sonst col [cur2] = cur2; } // Die Koordinaten der Variablen für Conversion -Schleifen zum neunten Raster lassen Key = sudo [math.floor (i/3)*3 + math.floor (k/3)] [Math.Floor (j/3)*3 + math.floor (k%3)] if (subsudo [key] // Das Urteil des Ninth -Gitters ähnelt dem Row. Das Urteil über Nullverlust ist optimiert. Der Wert beträgt 0, wenn der Schlüssel 0 ist. Es ist kein zusätzliches Urteil zurück.4. Traversallösung
Die Verwendung von Elementen mit dem Anfangswert von Null im Elementzustand ist eine ausstehende Funktion, und mit Hilfe des Stapels wird kein zusätzlicher Speicherplatz geöffnet.
Funktion findAnswer () {for (let i = 0; i <9; i ++) {für (lass j = 0; j <9;) {if (Problem [i] [j] == 0 || Flag) {// Die aktuelle Position ist die erste Verarbeitung des Elements, das bestimmt oder zurück zur aktuellen Position ist. Die beiden Situationen scheinen anders zu sein, aber tatsächlich ist die Verarbeitung dieselbe. Fügen Sie 1 von Ihnen hinzu flag = false; Sei K = Problem [i] [j] + 1; // Suche nach dem nächsten rechtlichen Wert, während (k <10) {// Schleife, um das nächste rechtliche Wertproblem zu finden [i] [j] = k; // füllen Sie ein, wenn (check20Grid (Problem, i, j) == 0) {// Standard ist legal, und das relevante 20-Frame-Urteil ist stack.push ([i, j ++]) // Speichern Sie den TraceBack-Punkt und Schritt in die Pause; } K ++; } if (k> 9) {// Der rechtliche Wert kann nicht an der aktuellen Position gefunden werden, das Traceback -Problem [i] [j] = 0; // Zurück vor dem Traceback lass Rt = stack.pop (); // Die Traceback -Informationen im Stapel abrufen, wenn (! Rt) // kein Lösungsurteil zurückgeben, 0 return 0; i = rt [0] // wandere j = rt [1] flag = true; }} else {// Die aktuelle Positionsnummer wird J ++ angegeben; }}} return 1; // erfolgreich eine Reihe von Lösungen gefunden}