Opis ruchów gońca

0

BitoBajtek uczy się właśnie gry w szachy. Poznaje ruchy poszczególnych figur w tym gońca. Zastanawia się,

w ilu minimalnie ruchach goniec może przejść z pola A do pola B. Na szachownicy goniec może poruszać się

po przekątnych jednego koloru o dowolną ilość pól. Przykładowe ruchy gońca zostały zaznaczone na rysunku

zaczernionymi kołami.

UWAGA: Kolumna ’a’ ma numer 1, a kolumna ’h’ ma numer 8.

Wejście

W pierwszym wierszu wejścia podane są dwie liczby całkowite dodatnie w1 i k1 będące odpowiednio numerem

wiersza i kolumny pola A, z którego startuje goniec (1 ≤ w1, k1 ≤ 8). W drugim wierszu wejścia podane są

dwie liczby całkowite dodatnie w2 i k2 będące odpowiednio numerem wiersza i kolumny pola B, na którym

ma znaleźć się goniec. (1 ≤ w2, k2 ≤ 8).

Wyjście

W pojedynczym wierszu powinna znaleźć się odpowiedź na postawiony problem: minimalna liczba ruchów, w

których goniec może przejść z pola A do pola B. Jeżeli goniec nie jest w stanie na dane pole, należy wypisać

NIE.

Przykład 1

Dla danych wejściowych:

4 4

4 8

poprawnym wynikiem jest:

2

Przykład 2

Dla danych wejściowych:

4 4

5 6

poprawnym wynikiem jest:

NIE

Przykład 3

Dla danych wejściowych:

1 1

8 8

poprawnym wynikiem jest:

1
Czy jest jakiś prosty sposób na opisanie tych ruchów?

6

abs(dx) == abs(dy) i to wystarczy

Dla pełnego zrozumienia:
|\Delta{x}| = |\Delta{y}|

4
kq napisał(a):

abs(dx) == abs(dy) i to wystarczy

Po rozpisaniu na chłopski rozum wychodzi mi coś takiego, ale nie wiem czy dobrze (algorytm w pseudokodzie który jest Haskellem bo C++ nie umiem :P ):

numberOfBishopMoves :: (Int , Int) -> (Int , Int) -> Maybe Int
numberOfBishopMoves (x1, y1) (x2, y2)
  | (x1 + y1 + x2 + y2) `mod` 2 == 1 = Nothing -- przejście niemożliwe
  | (x1 + y1) - (x2 + y2) == 0       = Just 1  -- leżą na jednej linii
  | (x1 - x2) - (y2 - y1) == 0       = Just 1  -- leżą na jednej linii
  | other                            = Just 2  -- nie leżą na jednej lini
5

@KamilAdam
(x1 + y1) - (x2 + y2) == 0 =>
x1 + y1 - x2 - y2 == 0 =>
x1 - x2 + y1 - y2 == 0 =>
(x1 - x2) + (y1 - y2) == 0 =>
(x1 - x2) - (y2 - y1) == 0 =>
(x1 - x2) == (y2 - y1)

(x1 - x2) - (y2 - y1) == 0 =>
(x1 - x2) == (y2 - y1)

Czyli napisałeś dwa jednakowych warunki.

3

O! Po zapytaniach widzę, że już październik mamy :-)

2

A wytłumaczyłby ktoś jak to działa w prostszy sposób? Jestem po pierwszym miesiącu liceum, więc nie wiem jak działają całki

Ale przecież @_13th_Dragon już to rozpisał bez całek (w zasadzie pochodnych). czyli warunek to abs(x2-x1) == abs(y2-y1) czyli (x2-x1) == (y2-y1) || (x2-x1) == -(y2-y1)

1 użytkowników online, w tym zalogowanych: 0, gości: 1