2013-05-03 7 views
105

Jestem nowy w programowaniu konkurencyjnej i zauważyłem często, wielu wielkich programistów mają te cztery linie w kodzie (szczególnie w tych tablicach udziałem):Jakie jest znaczenie inicjowania tablic kierunkowych poniżej z podanymi wartościami podczas opracowywania programu szachowego?

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 tak naprawdę oznacza i co to jest technika używany do?

+5

często używania 'D = {0,1,0, -1,0}' w tym: pozycja pary dla 'D [i], D [i + 1]' daje mi czterech głównych kierunków. – dasblinkenlight

+14

To jest zaskakująco dobre pytanie. ... Czy można coś zrobić z tytułem? –

+0

Zrobiłem co nieco o tytule/podpisie, ale to pomogłoby bardziej, gdyby było jakaś nazwa dla tej grupy tablic. Czy jest tam? –

Odpowiedz

84

Jest to technika kodowania wszystkich kierunków jako tablice - każda para di[i],dj[i] jest innym kierunkiem.

Jeśli wyobrażamy sobie, że mamy element w miejscu x, y, i chcemy dodać na jego x i jego wartość y, aby przenieść go do pobliskiego miejsca, 1,0 jest wschodem, -1,0 jest na zachód 0,1 oznacza południe, 0, -1 to północ i tak dalej.

(Tu już mówiłem jest lewy górny i dolny prawy 0,0 4,4 i jest pokazane co ruch każdy indeks tablic uczyni z centralnego punktu, X, na 2,2).

..... 
.536. 
.1X0. 
.724. 
..... 

Sposób, w jaki jest ustawiony, jeśli wykonasz ^1 (^ bitowo XOR) na indeksie otrzymasz przeciwny kierunek - 0 i 1 są przeciwieństwami, 2 i 3 są przeciwieństwami i tak dalej. (Innym sposobem, aby ustawić go w górę, aby przejść do ruchu wskazówek zegara zaczynając od północy. - wtedy ^4 dostaje odwrotny kierunek)

Teraz można przetestować wszystkie kierunki z danego punktu przez zapętlenie nad swoimi di i dj tablic, zamiast konieczności wypisać każdym kierunku na własnej linii (do ośmiu w sumie!) (Tylko nie zapomnij zrobić sprawdzając granice :))

diK i djK formę wszystkich knights directions zamiast wszystkich sąsiednich kierunkach. Tutaj ^1 obróci się wzdłuż jednej osi, ^4 da przeciwny skok rycerza.

.7.6. 
0...5 
..K.. 
1...4 
.2.3. 
+3

jakie są "wskazówki rycerzy"? – David

+8

@Dave http://en.wikipedia.org/wiki/Knight_(chess) – Patashu

+4

Och, ten rodzaj rycerza. – David

63

Dla tych, dla których zrozumienie Patashu jest trudne do zrozumienia, spróbuję wyjaśnić.

Wyobraź sobie, że próbujesz rozważyć każdy możliwy ruch z danego punktu na szachownicy.

Jeśli wykonasz pętlę nad tablicami di i dj, interpretując wartości di jako przesunięcia x oraz wartości dj jako przesunięcia y, pokryjesz każdy z możliwych 8 kierunków.

Zakładając, że dodatnie x jest wschodem, a dodatnie y jest południe (jak w odpowiedzi Patashu), otrzymuje się następujące;

 
    | di/x | dj/y | Direction 
--+------+------+----------- 
0 | 1 | 0 | east 
1 | -1 | 0 | west 
2 | 0 | 1 | south 
3 | 0 | -1 | north 
4 | 1 | 1 | south-east 
5 | -1 | -1 | north-west 
6 | 1 | -1 | north-east 
7 | -1 | 1 | south-west 

Tablice diK i djK można interpretować w ten sam sposób, aby ustalić możliwe ruchy dla fragmentu rycerza. Jeśli nie znasz szachów, rycerz porusza się w układzie L - dwa kwadraty w jednym kierunku, a następnie jeden kwadrat pod kątem prostym do tego (lub odwrotnie).

 
    | diK/x | djK/y | Direction 
--+-------+-------+---------------- 
0 | -2 | -1 | 2 west, 1 north 
1 | -2 | 1 | 2 west, 1 south 
2 | -1 | 2 | 1 west, 2 south 
3 | 1 | 2 | 1 east, 2 south 
4 | 2 | 1 | 2 east, 1 south 
5 | 2 | -1 | 2 east, 1 north 
6 | 1 | -2 | 1 east, 2 north 
7 | -1 | -2 | 1 west, 2 north 
1

Mały fragment kodu służący do sprawdzenia liczby ruchów możliwych we wszystkich kierunkach, w których używane są zdefiniowane tablice.

int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 }; 
int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 }; 
int movesPossible[8]; 
int move = 0; 
int posx, posy; // position of the figure we are checking 

for (int d=0; d<8; d++) { 
    for (move = 1; board.getElt(posx+di[d]*move, posy+dj[d]*move)==EMPTY; move++) ; 
    movesPossible[d] = move-1; 
} 
Powiązane problemy