Ja, ich weiß, das ist nichts Neues und es gibt bereits viele Fragen (es hat sogar ein eigenes Tag), aber ich würde gerne einen Sudoku Solver in Java nur für den Zweck erstellen Ich trainiere mich selbst, um Code zu schreiben, der effizienter ist.Einen EFFIZIENTEN Sudoku Solver erstellen
Wahrscheinlich die einfachste Möglichkeit, dies in einem Programm zu tun ist eine Tonne for Schleifen durch jede Spalte und Zeile analysieren, sammeln Sie die möglichen Werte jeder Zelle, dann die Zellen mit nur einer Möglichkeit (ob sie nur enthalten 1 Zahl, oder sie sind die einzige Zelle in ihrer Reihe/Spalte, die diese Zahl enthält), bis Sie ein gelöstes Puzzle haben. Natürlich sollte ein bloßer Gedanke an die Aktion in jedem Programmierer eine rote Fahne aufkommen lassen.
Was ich suche ist die Methodik, um diesen Sucker auf die effizienteste Weise zu lösen, die möglich ist (bitte versuchen Sie, nicht zu viel Code aufzunehmen - ich möchte diesen Teil herausfinden, ich selbst).
Ich möchte mathematische Algorithmen möglichst vermeiden - das wäre zu einfach und 100% nicht meine Arbeit.
Wenn jemand einen Schritt-für-Schritt, effizienten Denkprozess für die Lösung eines Sudoku Puzzlespiels (ob durch einen Menschen oder einen Computer) zur Verfügung stellen könnte, würde ich am glücklichsten sein :). Ich suche nach etwas, das vage ist (so ist es eine Herausforderung), aber informativ genug (damit ich nicht völlig verloren bin), um mich zu beginnen.
Vielen Dank,
Justian Meyer
EDIT:
an meinem Code Sehen, ich zum Denken habe: was sind einige der Möglichkeiten zur Speicherung dieser Lösung Zustände (dh wäre die Sudoku-Gitter). 2D-Arrays und 3D-Arrays kommen mir in den Sinn. Was könnte das Beste sein? 2D könnte von der Oberfläche aus leichter zu verwalten sein, aber 3D-Arrays würden auch die "Box"/"Käfig" -Nummer liefern.
EDIT:
Nevermind. Ich werde mit einem 3D-Array gehen.
Auch wenn Sie mit dem "Ausmerzen, bis nur noch eine Möglichkeit übrig ist" gehen, werden Sie immer noch nicht in der Lage sein, einige Sudokus zu lösen. Es gibt eine Menge "härterer" Sudokus, in denen Sie tatsächlich eine Art von Suche durchführen müssen, bevor Sie sicher sein können, welche Nummer wo platziert werden soll (DFS/BFS). Sonst ist das Durchlaufen jeder Spalte usw. nicht wirklich - so schrecklich - oder ineffizient, solange Sie die Datenstrukturen entsprechend einrichten, aber wie ich bereits sagte, wird es nicht alle Sudokus lösen. – wasatz
@wasatz: Ja, ich habe ein wenig Nachforschungen angestellt und festgestellt, dass. Es sieht jedoch so aus, als hätten viele andere Menschen effizientere Work-arounds gefunden, die, obwohl ich es nicht zugeben möchte, weit über meinem Verständnisstand liegen. –
@Justian, ich habe schnell gegoogelt und einige Empfehlungen für die Verwendung des "Dancing Links Algorithm" (http://en.wikipedia.org/wiki/Dancing_Links) gefunden. Ich habe diesen Algorithmus vorher nicht gesehen (und ich habe momentan keine Zeit, genau in diesen Moment hinein zu lesen), aber es sieht vielversprechend aus. Vielleicht etwas, das einen Blick wert ist? :) – wasatz