Nie mam doświadczenia w programowaniu konkurencyjnym i często zauważyłem, że wielu świetnych programistów ma w swoim kodzie te cztery wiersze (szczególnie w przypadku tablic):
int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 };
int diK[] = { -2, -2, -1, 1, 2, 2, 1, -1 };
int djK[] = { -1, 1, 2, 2, 1, -1, -2, -2 };
Co to naprawdę oznacza i do czego służy technika?
d={0,1,0,-1,0}
do tego: pary przedmiotów, któred[i], d[i+1]
dają mi cztery główne kierunki.Odpowiedzi:
Jest to technika kodowania wszystkich kierunków jako tablic - każdej pary
di[i],dj[i]
jest w innym kierunku.Jeśli wyobrazimy sobie, że mamy kawałek w miejscu x, y i chcemy dodać do jego wartości x i y, aby przenieść go w pobliskie miejsce, 1,0 to wschód, -1,0 to zachód, 0,1 to południe, 0, -1 to północ i tak dalej.
(Tutaj powiedziałem, że górny lewy to 0,0, a dolny prawy to 4,4 i pokazałem, jaki ruch każdy indeks tablic wykona od centralnego punktu, X, na 2,2.)
Sposób, w jaki jest ustawiony, jeśli zrobisz
^1
(^
będąc bitowym XOR) na indeksie, otrzymasz odwrotny kierunek - 0 i 1 to przeciwieństwa, 2 i 3 to przeciwieństwa i tak dalej. (Innym sposobem ustawienia jest pójście zgodnie z ruchem wskazówek zegara, zaczynając od północy - wtedy^4
dostajesz się w przeciwnym kierunku.)Teraz możesz przetestować wszystkie kierunki z danego punktu, przechodząc nad
di
idj
tablice, zamiast wpisywać każdy kierunek w osobnej linii (w sumie osiem!) (Tylko nie zapomnij sprawdzić granic :))diK
idjK
formuj wszystkie kierunki rycerzy zamiast wszystkich sąsiednich kierunków. Tutaj^1
odwróci się wzdłuż jednej osi,^4
da przeciwny skok skoczka.źródło
x,y
krotkę w przestrzeni 2D. Dla każdej parydi[i], dj[i]
dodaj ją do,x,y
a zostanieszx,y
transponowany w każdym kierunku jeden po drugim. Czy to ma sens?Spróbuję to wyjaśnić tym, którzy uważają wyjaśnienie Patashu za trudne do zrozumienia.
Wyobraź sobie, że próbujesz rozważyć każdy możliwy ruch z danego punktu na szachownicy.
Jeśli zapętlisz tablice di i dj, interpretując wartości di jako przesunięcia x, a wartości dj jako przesunięcia y, obejmiesz każdy z 8 możliwych kierunków.
Zakładając, że dodatnie x to wschód, a dodatnie y to południe (tak jak w odpowiedzi Patashu), otrzymamy:
Tablice diK i djK mogą być interpretowane w ten sam sposób, aby ustalić możliwe ruchy dla figury skoczka. Jeśli nie jesteś zaznajomiony z szachami, rycerz porusza się w układzie L - dwa pola w jednym kierunku, a następnie jedno pole pod kątem prostym (lub odwrotnie).
źródło
Mały fragment kodu do sprawdzania liczby możliwych ruchów we wszystkich kierunkach, który wykorzystuje zdefiniowane tablice.
źródło