Ein Sudoku-Solver in c

Ein Sudoku-Solver in C ist ein konsolenbasiertes Linux-Programm, das in C-Sprache verfasst ist, der su Doku-Puzzles mit deduktiver Logik löst.
Jetzt downloaden

Ein Sudoku-Solver in c Ranking & Zusammenfassung

Anzeige

  • Rating:
  • Lizenz:
  • GPL
  • Preis:
  • FREE
  • Name des Herausgebers:
  • Bill DuPree
  • Website des Verlags:
  • http://www.techfinesse.com/sshutout/sshutout.html

Ein Sudoku-Solver in c Stichworte


Ein Sudoku-Solver in c Beschreibung

Ein Sudoku-Solver in C ist ein konsolenbasiertes Linux-Programm, das in C-Sprache verfasst ist, das su Doku-Puzzles mit deduktiver Logik löst. Ein Sudoku-Solver in C ist ein konsolenbasiertes Linux-Programm, das in C-Sprache verfasst ist, das su Doku-Puzzles mit deduktiver Logik löst. Sie gilt nur auf Probe- und Fehler- und Backtracking-Ansätze, wenn er seine deduktiven Moves-Ansätze erhebt. Rätsel sollten als 81 Zeichen-Saiten eingereicht werden, die beim Lesen von links nach rechts ein 9x9 Sudoku-Gitter von links nach rechts und oben nach unten füllen. In der Puzzlespezifikation stellen die Zeichen 1 - 9 die Puzzle-Givens oder Hinweise dar. Jeder andere nicht leere Zeichen stellt eine ungelöste Zelle dar. Der Rätsellösalgorithmus ist zu Hause angebaut. Ich leihe keine der üblichen Techniken aus der Literatur, z. Donald Knuths "Tanzverbindungen". Stattdessen rollte ich meine eigene von Grund auf als persönliche Herausforderung. Somit kann seine Leistung nur auf Ihre wirklich verantwortlich gemacht werden. Trotzdem fühle ich das Gefühl, dass es ziemlich schnell ist. Auf einem 333 MHz Pentium II Linux Box löst es typische mittlere Kraftpuzzles in ca. 800 Mikrosekunden oder etwa 1.200 Puzzzeln pro Sekunde, geben oder nehmen. Auf einem Athlon XP 3000 löst es etwa 6.600 Rätsel pro Sek. (Die Lösungszeit ist abhängig von dem Schwierigkeitsgrad, so YMMV.) Beschreibung des Algorithmus: Der Puzzle-Algorithmus geht zunächst an, dass jede ungelöste Zelle jeden möglichen Wert annehmen kann. Es verwendet dann die Platzierung der Givens, um die für jede Zelle zur Verfügung stehenden Optionen zu verfeinern. Ich nenne dies die Markup-Phase Sobald diese Zellen zugewiesen sind, kehrt der Algorithmus in die Markup-Phase zurück, um diese Änderungen an den verbleibenden Kandidatenlösungen anzuwenden. Die Markup- / Singleton-Phasen wechseln sich ab, bis entweder keine Änderungen mehr auftreten, oder das Rätsel wird gelöst. Ich rufe die Markup / Singleton-Eliminationsschleife des einfachen Solvers an, denn in einem großen Prozentsatz der Fälle löst er das Rätsel. Wenn der einfache Solver-Teil des Algorithmus keine Lösung erzeugt, werden weitere fortschrittliche deduktive Regeln angewendet. Ich habe zwei zusätzliche Regeln als Teil des deduktiven Puzzletierlösers umgesetzt. Die erste ist Subset-Eliminierung, bei der eine Zeile / Spalte / Region für X-Anzahl von Zellen mit X-Nummer der passenden Kandidatenlösungen gescannt wird. Wenn solche Untergruppen (oder Tupel) in der Reihe, der Spalte oder in der Region gefunden werden, können die Kandidatenwerte von der Teilmenge von allen anderen ungelösten Zellen innerhalb der Zeile, Säule bzw. Region eliminiert werden. Die nächste deduktive Regel prüft jeweils Region, die nach Kandidatenwerten auf der Suche nach Kandidaten, die sich ausschließlich entlang einer einzelnen Reihen oder Spalte ausrichten, dh einem Vektor. Wenn solche Kandidatenwerte gefunden werden, können sie außerhalb des Bereichs aus den Zellen außerhalb des Bereichs beseitigt werden, der Teil der ausgerichteten Zeile oder der Spalte ist.note, dass jeder der fortschrittlichen deduktiven Regeln alle vorangegangenen Regeln anruft, in der Reihenfolge, wenn diese fortschrittliche Regel hat Wird eine Änderung des Puzzle-Markups durchgeführt. Eine Arbeitskopie wird aus unserem Puzzle erstellt und mit dieser Kopie der ersten Zelle mit der kleinsten Anzahl von Kandidatenlösungen ausgewählt. Eine der Lösungswerte ist dieser Zelle zugewiesen, und der Solver-Algorithmus wird mit dieser Arbeitskopie als Ausgangspunkt aufgerufen. Schließlich ist entweder eine Lösung oder eine Sackgasse erreicht. Wenn wir eine Sackgasse erreichen, entspannt der Rekursion und die nächste Testlösung wird versucht. Wenn eine Lösung gefunden wird (an einem beliebigen Punkt) werden die Werte für die Lösung einer Liste hinzugefügt. Wieder, solange wir alle Möglichkeiten untersuchen, entfaltet der Rekursion so, dass die nächste Versuche versucht werden kann. Es ist auf diese Weise, dass wir Puzzles mit mehreren Lösungen auflisten. Freund, dass es sicherlich möglich ist, die Liste der angewandten deduktiven Regeln hinzuzufügen. Die Techniken, die als "X-Wing" und "Swordfish" bekannt sind, kommen in den Sinn. Andererseits wird das Hinzufügen dieser zusätzlichen Regeln in aller Wahrscheinlichkeit den Lösungen verlangsamen, indem er die rechnerische Belastung bei der Erzeugung nur sehr wenige Ergebnisse ergibt. Ich habe das Gesetz der verringerten Renditen auch in einigen der bestehenden Regeln gesehen, z. In der Subset-Eliminierung schaue ich nur zwei und drei geschätzte Subsets, weil es weitergegeben wird, als diese degradierte Leistung zu nehmen als wiederverwendbares Objektmodul. · Das Puzzle-Scoring-System wurde verbessert, und ein Fehler, der eine frühe Gabelung verursacht hat, wurde behoben.


Ein Sudoku-Solver in c Zugehörige Software