2010-10-29 26 views
7

Oto dobry do refleksji na temat:Rozwiązywanie Kakuro puzzle

http://en.wikipedia.org/wiki/Kakuro

Ja próbuje dokonać solver dla tej gry. Dokumentacja jest skończona (czytanie pliku początkowego ze zmienną liczbą kolumn i wierszy) Zakłada się, że plik wejściowy jest zgodny z regułami gry, więc gra jest zawsze możliwa do rozwiązania. Poświęć trochę czasu na przeczytanie zasad gry:

I Wcześniej pod opieką struktury danych, które myślę, że będzie pasować najlepiej:

struct aSquare { int verticalSum; int horizontalSum; int value; } 

i złożył «tablicę» tych dynamicznie pracować na zrobiłem to tak, że czarne kwadraty mają wartość -1. białe kwadraty (rzeczywiste kwadraty rozwiązania) inicjalizują się w punkcie 0. Można również łatwo uzyskać położenie każdej struktury aSquare z tablicy, bez potrzeby tworzenia dla niej dodatkowych pól struktury.

Teraz algorytm ... W jaki sposób na świecie rozjemcę wszystkie te sumy i znajdę ogólny sposób, który rozwiąże wszystkie rodzaje sieci. Walczyłem z tym przez całe popołudnie bezskutecznie.

Pomoc jest doceniana, baw się dobrze!

* EDYCJA: Właśnie zdałem sobie sprawę, że opublikowany link zawiera kilka wskazówek dotyczących technik rozwiązywania. Nadal będę to sprawdzać, aby zobaczyć, co ludzie wymyślą.

Odpowiedz

5

Prosty brute-force na Sudoku solver trwa milisekundy biegać, więc nie trzeba się przejmować wykonania żadnych specjalnych taktyk. Myślę, że w przypadku Kakuro to będzie to samo. Prosty algorytm:

def solve(kakuro): 
    if kakuro has no empty fields: 
     print kakuro 
     stop. 
    else: 
     position = pick a position 
     values = [calculate possible legal values for that field] 
     for value in values: 
      kakuro[position] = value 
      solve(kakuro) 
     kakuro[position] = None # unset after trying all possibilities 

Ten algorytm może działać lepiej, jeśli znajdziesz najlepszą kolejność pól do wypełnienia. Spróbuj wybrać pola, które będą najbardziej ograniczone (jak w: nie ma wielu wartości, które są legalne).

W każdym razie najprawdopodobniej będzie to najprostsze do wykonania, więc spróbuj i poszukaj bardziej wyrafinowanych rozwiązań tylko wtedy, gdy ten nie zadziała. (W rzeczywistości jest to jeden z najprostszych solverów programistycznych, a prawdziwe rozwiązania CP są oczywiście bardziej skomplikowane).

+0

Należy zauważyć, że istnieje spora przestrzeń do sprytności w kroku "[obliczyć możliwe wartości prawne dla tego pola]". – Brian

+0

@Brian: więcej do wybrania pozycji, jak w wielu algorytmach może to oznaczać przejście od wielomianu do czasu wykładniczego. Kakoru jest NP-zupełny, ale wciąż mądrze wybierający porządek może znacznie zmniejszyć stałe. A obliczanie możliwych wartości prawnych powinno w każdym razie być stałym czasem z odpowiednimi strukturami danych. – liori

+0

Wystarczająco fair.W rozwiązaniu zaprojektowanym przeze mnie (dla innej układanki), jedną sztuczką, której użyłem, było odebranie ** każdej ** pozycji i wypróbowanie jej w jednej iteracji, używając dowodu przez sprzeczność, aby zmniejszyć liczbę możliwych wartości prawnych. Wypełniłem również wszystkie przestrzenie, które miały tylko jedną możliwą wartość prawną. Tak więc moja łamigłówka miała de facto funkcję "[obliczyć możliwe wartości prawne dla każdego pola]". Mój selektor pozycji do odgadywania nie miał żadnej inteligencji i naprawdę go nie potrzebował. Aby być sprawiedliwym, Nurikabe jest układanką binarną, więc wszystkie pozycje są równie ograniczone. – Brian

0

Jest to prosta algebra liniowa, należy użyć technik manipulacji wektor/macierz do rozwiązania.

[edit - odpowiadając na komentarze]

a + b + 0 + d + 0 = n1 
0 + b + c + 0 + e = n2 
a + 0 + c + 0 + 0 = n3 
a + b + c + 0 + e = n4 
a + 0 + c + d + 0 = n5 

powyżej jest konwertowany do matrycy, a przez dodawanie i odejmowanie wielokrotności wierszy, możesz skończyć z:

a 0 0 0 0 na 
0 b 0 0 0 nb 
0 0 c 0 0 nc 
0 0 0 d 0 nd 
0 0 0 0 e ne 

Brak kombinatoryki, wszystkie pozostają liczbami całkowitymi.

+1

Korzystanie z algebry liniowej zazwyczaj nie kończy się na rozwiązaniu całkowitym. Kombinatoryka musi jakoś wejść. –

+3

Algebra liniowa nie może reprezentować zasady duplikacji cyfr. – liori

+0

W twoim przykładzie istnieje kolejność eliminacji, w której rozwiązaniem są wszystkie liczby całkowite, ale znalezienie takiej kolejności dla ogólnej macierzy 0-1 nie jest łatwe. Spróbuj przeprowadzić eliminację gaussowską w kolejności, w jakiej ją przedstawisz, przekonasz się, że 1/2 wkrada się. W tym przypadku łatwo jest znaleźć porządek (jeden przykład to a, b, d, c, e), ale w generalnie powinieneś być w stanie cofnąć się w GE w przypadku, gdy późniejszy element matrycy okaże się ułamkowy z powodu wcześniejszej decyzji. –

2

Jeśli Twoim zainteresowaniem jest ostatecznie tworzenie oprogramowania do tych gier, ale nie dostaniesz się do szczegółów algorytmu, polecam użycie silnika do programowania wiązań (CP). CP to deklaratywny paradygmat programowania, który bardzo dobrze nadaje się do tego rodzaju problemów. Dostępnych jest kilka komercyjnych i otwartych źródeł CP.

http://en.wikipedia.org/wiki/Constraint_programming

+0

To w tej chwili tylko ta gra. Próbowałem stworzyć coś bardziej złożonego dla siebie. Dzięki za wskazówkę – Qosmo

1

Przypuszczam, że Linear Programming mogą być łatwo wykorzystane do rozwiązania tego rodzaju gry .. to jest to problem, dla których całkowita dokładne rozwiązania nie istnieją .. (metoda podziału i ograniczeń? cięcia-plane?)

W każdym przypadku przy użyciu tabeli z najbardziej pewnych kombinacjach będzie przydatna na pewno (np http://www.enigmoteka.com/Kakuro%20Cheatsheet.pdf)

+0

+1 za cheatsheet/table. – LarsH

0

znalazłem kilka ciekawych sztuczek bit manipulacji, które przyspieszają rozwiązywanie Kakuro. Możesz pobrać źródło here.

6

Jeśli chodzi o ograniczanie Programowanie: Oto kilka różnych sposobów rozwiązania łamigłówki Kakuro z programowaniem wiązań (wszystkie przy użyciu tej samej podstawowej zasady). Instancja problemu została naprawiona w programie.

Edycja: Dodano Google lub-tools/C# i odpowiedzi zestaw programowania.

+1

Przydatne linki, dzięki! – Qosmo