Uwaga: chodzi o standardową łamigłówkę sudoku 9x9. Rozwiązanie musi obsługiwać tylko rozwiązane, legalne zagadki . Dlatego rozwiązanie nie musi obsługiwać pustych komórek i może polegać na właściwościach rozwiązanej łamigłówki sudoku.
Zastanawiałem się nad tym, ale nie mogłem wymyślić odpowiedzi, z której byłbym zadowolony. Naiwne rozwiązanie wykorzystywałoby jeden bajt na każdą komórkę (81 komórek), w sumie 648 bitów. Bardziej wyrafinowane rozwiązanie przechowałoby całą łamigłówkę sudoku w liczbie podstawowej 9 (jedna cyfra na komórkę) i wymagałoby bitów.
Ale nadal można go poprawić, na przykład, jeśli znasz 8 z 9 liczb w podsiatce 3x3, możesz w prosty sposób wydedukować 9. Możesz kontynuować te myśli do tego stopnia, że pytanie sprowadza się do: Ile jest unikalnych rozwiązanych sudokusów? Teraz możesz użyć ogromnej tabeli odnośników, która odwzorowuje każdą liczbę binarną na łamigłówkę sudoku, ale nie byłoby to użytecznym rozwiązaniem.
Więc moje pytanie:
Odpowiedzi:
Wzdłuż tych samych wierszy, co odpowiedź maniaka zapadkowego, jeśli wypełnisz komórki bez gwiazdek w poniższej macierzy, pole 3x3 na raz, zawsze wybierając kolejne pole do wypełnienia, aby było tym, które dzieli wiersze lub kolumny z polem, które ty już wypełniono, otrzymujesz następujący wzór dla liczby wyborów na krok (najpierw wypełniając górne środkowe pole, następnie prawe górne pole itp.).
W każdym polu 3x3 po pierwszym, po wypełnieniu jednego wiersza lub kolumny pola, trzy z pozostałych sześciu cyfr są zlokalizowane w jednym rzędzie. Najpierw wybierz ich lokalizacje, a następnie wypełnij pozostałe trzy komórki. (Tak więc rzeczywista kolejność wypełniania komórek może się różnić w zależności od tego, co już wiesz, ale liczba opcji nigdy nie jest większa niż to, co pokazałem).
Po wypełnieniu tych komórek wszystkie gwiazdy są określone.
Jeśli poprawnie obliczyłem, daje to 87 bitów. Według komentarza Petera Shora w ostatnim bloku 3x3 można zaoszczędzić kilka dodatkowych: każda wartość jest zlokalizowana w jednej z czterech komórek, a każdy wiersz zawiera co najmniej jedną komórkę z tylko czterema możliwymi wartościami, więc na pewno czynniki w tym blok powinien zaczynać się od 4, a nie 6, ale nie rozumiem pozostałych czynników w odpowiedzi Shora.
źródło
6 5 4 4 3 2 3 2 1
Uważam, że w drugim polu musi być6 5 4 6 5 4 3 2 1
w najgorszym przypadku.kontynuując z odpowiedzią @ peter, oto lista najgorszych przypadków dla każdej komórki, gdy wypełniasz ją, zaczynając od lewego górnego rogu
to daje 4,24559E + 29 możliwości lub 99 bitów
edycja: zapomniałem, że ostatni kwadrat jest w pełni określony przez wszystkie inne
źródło
Nie potrzebujesz pełnej tabeli przeglądowej, aby uzyskać optymalną ściśliwość. Uważam, że współczesne komputery korzystające z bardzo rozsądnej tabeli przeglądowej są w stanie policzyć liczbę ograniczonych Sudokusów, które są Sudokusami z niektórymi cyframi już na miejscu. Korzystając z tego, oto jak kodujesz (dekodowanie jest podobne).
Edycja: strona Wikipedii na temat matematyki Sudoku pomaga nam wyjaśnić obraz. Pomocna jest również tabela skompilowana przez Eda Russella .
Okazuje się, że jeśli weźmie się pod uwagę tylko trzy górne rzędy, wówczas zasadniczo należy wziąć pod uwagę tylko 44 różne konfiguracje. W tabeli można znaleźć całkowitą liczbę konfiguracji równoważną dowolnej z nich (zakładając, że górny wiersz to 123456789) oraz całkowitą liczbę ukończeń każdej z nich. Biorąc pod uwagę Sudoku, oto jak obliczymy jego liczbę porządkową:
Ta procedura jest odwracalna i wygeneruje Sudoku z liczby porządkowej. Zauważ, że wyliczenie Sudoku zostało zmniejszone do kilku minut (w 2006 r .; patrz strona dyskusji w artykule w Wikipedii) lub mniej, więc oczekuję, że na nowoczesnym komputerze takie podejście byłoby bardzo praktyczne i zajęłoby kilka sekund lub mniej.
źródło
Oto algorytm, który, jak podejrzewam, da całkiem dobre kodowanie. Masz gotowe sudoku, które chcesz skompresować, i powiedzmy, że już zakodowałeś niektóre jego komórki, więc jest częściowe sudoku (niekoniecznie z unikalnym rozwiązaniem) z wypełnionymi niektórymi komórkami.
Użyj ustalonego algorytmu, aby policzyć, ile liczb można umieścić w każdej pustej komórce. Znajdź leksykograficznie pierwszą komórkę, w której można umieścić najmniejszą liczbę różnych liczb, i zakoduj, która z tych liczb się w niej znajduje (więc jeśli komórka może zawierać tylko 3, 7 lub 9, cyfra 3 jest kodowana przez „0 ”, 7 przez„ 1 ”i 9 przez„ 2 ”). Zakoduj powstałą sekwencję, stosując kodowanie arytmetyczne (które uwzględnia liczbę możliwych liczb, które może zawierać komórka).
Nie wiem, jak długa będzie wynikowa sekwencja binarna, ale podejrzewam, że jest ona dość krótka, szczególnie jeśli Twój algorytm zliczania liczby liczb, które można umieścić w komórce, jest dość wyrafinowany.
Jeśli masz dobry algorytm, który ocenia prawdopodobieństwo każdej komórki zawierającej określoną liczbę, możesz zrobić jeszcze lepiej.
źródło
Wszelkie komentarze i krytyki są mile widziane
1.) Przechowywanie puzzli oznacza przechowywanie rozwiązania (informacje teoretycznie).
źródło
Ma to zgłosić implementację skompresowanego kompaktowego kodowania sudoku (podobnego do sugestii Zurui Wanga 9/14/11).
Dane wejściowe to górny rząd i pierwsze 3 cyfry drugiego rzędu. Te są zredukowane do 1-9! oraz 1-120 i połączone do <= 4,4x10 ^ 7. Są one używane jako dane do liczenia leksykograficznego wszystkich częściowych sukokusów o długości 30 cyfr aż do pasującej sekwencji. Następnie końcowe liczenie do wszystkich 81 cyfr odbywa się w ten sam sposób. Te 3 sekwencje są przechowywane jako 32-bitowe liczby całkowite o maksymalnej długości 26 bitów, dzięki czemu można je dalej kompresować. Cały proces zajmuje około 3 minut, przy czym pierwsze 30 cyfr zajmuje większość czasu. Dekodowanie jest podobne - z wyjątkiem dopasowywania liczby zamiast sudokus.
Wkrótce - Wersja zawiera pierwsze 3 cyfry drugiego wiersza w wyliczeniu 30 cyfr (2. 32-bitowy kod), porównania z wyliczeniem Jarvisa (Jscott, 3/1615)
źródło
Wybrałbym następującą prostą analizę:
Każda wartość może być przechowywana w 4 bitach (zakresy od 1 do 9, te trzy bity pozwalają nawet na 0-16)
Chyba mógłbym to zredukować do:
gdzie
Edycja: Neo Style: znam lateks.
źródło
Ta liczba jest inna dla każdego Sudoku. Jedną z zasad dla Sudoku jest to, że ma dokładnie jedno rozwiązanie.
Jeśli spojrzysz na przykład, jest to minimalna ilość danych, którą musisz przechowywać.
Jeśli pracujesz po przeciwnej stronie, możesz usunąć cyfrę po cyfrze i uruchomić solver na wyniku, aby sprawdzić, czy nadal ma dokładnie jedno rozwiązanie. Jeśli tak, możesz usunąć kolejną cyfrę. Jeśli nie, musisz przywrócić tę cyfrę i wypróbować inną. Jeśli nie możesz, znalazłeś minimum.
Ponieważ większość zagadek zaczyna się w większości pustych, kodowanie długości przebiegu prawdopodobnie przyniesie dobre wyniki.
źródło