MiniProgram powraca, czyli SudokuSolver
Dzisiaj i wczoraj siedziałem nad małym programem o nazwie SudokuSolver. Mam zrobiony model bazujący na liczeniu dostępnych możliwości. Każda komórka ma tablicę dostępnych pól, na zmianę tej tablicy informuje słuchaczy o tym fakcie. Dodatkowo informuje o tym, że pozostała już tylko jedna możliwość, jak również o tym, że nie ma już żadnych prawidłowych możliwości dla danej komórki (będzie przydatne przy określaniu błędnie wypełnionego diagramu). Diagram z kolei przechwytuje zdarzenia ze wszystkich komórek, z których się składa i przekazuje w zmienionej formie (DiagramChangeEvent) wyżej.
W modelu obecnie stosowana jest prosta reguła eliminacji z dostępnych możliwości tych, które są już niedostępne ze względu na wykorzystanie już w kolidujących komórkach. Model wspiera sudoku o dowolnej podstawie kwadratowej (1,4,9,…), natomiast szybko pisane GUI nie ma żadnego wsparcia obsługi błędów, ani możliwości wyboru wielkości diagramu. Nie mniej możecie wprowadzać diagramy i przeliczać pola, które da się obliczyć.
W planach mam rozwinięcie solvera o dwa algorytmy:
- dedukowanie wartości na podstawie dostępności w innych komórkach kolidujących (przykładowo jeśli komórki w danym wierszu mają możliwości [1 3] [1 3] [1 5] algorytm powinien ustawić trzeciej z nich wartość na 5)
- liczenie drzewa kombinacji. W pierwszej komórce, która ma co najmniej dwie możliwości wybieramy jedną z nich i próbujemy rozwiązać za pomocą dwóch pierwszych algorytmów. Jeśli nadal pozostaną pola nierozwiązane powtarzamy podstawianie jednej wartości. Jeśli natrafimy na konflikt (zero możliwości w którymkolwiek polu) pobieramy ze stosu diagram sprzed ostatniego podstawienia i podstawiamy kolejną wartość, której nie przetestowaliśmy.
Posted on 18 December 2011
Under: Programming | No Comments »
english
polski