Biorąc pod uwagę rozmiar szachownicy i początkową pozycję rycerza, oblicz prawdopodobieństwo, że po k
ruchach rycerz znajdzie się na szachownicy.
Uwaga:
Rycerz wykonuje wszystkie 8 możliwych ruchów z jednakowym prawdopodobieństwem.
Gdy rycerz znajdzie się poza szachownicą, nie może wrócić do środka.
Wejście
Dane wejściowe są oddzielone przecinkami w postaci:
l,k,x,y
gdzie l
jest długość i szerokość szachownicy, k
liczba ruchów, które wykona rycerz, x
pozycja x pozycji początkowej rycerza i y
pozycja y pozycji początkowej rycerza. Zauważ, że 0,0
jest to lewy dolny róg planszy i l-1,l-1
prawy górny róg planszy.
Algorytm:
Zacznij od początkowych współrzędnych rycerza. Wykonaj wszystkie możliwe ruchy dla tej pozycji i pomnóż je z prawdopodobieństwem, dla każdego ruchu rekurencyjnie wywołaj funkcję kontynuuj ten proces do momentu spełnienia warunku zakończenia. Warunkiem zakończenia jest sytuacja, gdy rycerz znajduje się poza szachownicą, w tym przypadku zwróć 0 lub pożądana liczba ruchów zostanie wyczerpana, w tym przypadku zwróć 1.
Jak widzimy, aktualny stan rekurencji zależy tylko od bieżących współrzędnych i liczby wykonanych do tej pory kroków. Dlatego możemy zapamiętać te informacje w formie tabelarycznej.
Kredyt
Wyzwanie to pochodzi z postu na blogu crazyforceode.com opublikowanego na licencji CC BY-NC-ND 2.5 IN . Został nieco zmodyfikowany, aby uczynić go nieco trudniejszym.
Odpowiedzi:
Pyth, 38 bajtów
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
Ruby 134
Wypróbuj online: http://ideone.com/ZIjOmP
Odpowiednik kodu nie golfowego:
źródło
Haskell - 235
Implementuje funkcję
f
z parametramil k x y
źródło
Matlab,
124119Dokładnie implementuje opisany algorytm.
Byłem w stanie skrócić go o 5 bajtów przy pomocy @sanchises, dzięki!
Rozszerzony:
Stara wersja
źródło
s
jest inicjowana przez MATLAB, więc możesz to zrobićs(l,l)=0
; Szkoda, że MATLAB nie ma wbudowanej funkcji fibonnaci, co byłoby świetną optymalizacjąm
.m
przez rozkład macierzy ...m+m'+fliplr(m+m')
wydaje się być wzrostem liczby bajtów, podobnie jak wszystkie inne moje opcje.Mathematica - 137
Stosowanie:
Wynik:
źródło
MATLAB - 106
Poprawiono rozwiązanie @ flawr, ponieważ jest bardziej MATLAB-y.
Rozszerzony:
źródło
> <> - 620 (nie licząc białych znaków)
Początkowy stos powinien być
l,k,x,y
Przetestuj to
źródło