Je suis nouveau dans la programmation compétitive, et j'ai souvent remarqué que bon nombre des grands codeurs ont ces quatre lignes dans leur code (en particulier dans celles impliquant des tableaux):
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 };
Qu'est-ce que cela signifie vraiment et à quoi sert la technique?
d={0,1,0,-1,0}
pour cela: des paires d'articles pourd[i], d[i+1]
me donner quatre directions cardinales.Réponses:
Il s'agit d'une technique pour encoder toutes les directions sous forme de tableaux - chaque paire de
di[i],dj[i]
est une direction différente.Si nous imaginons que nous avons une pièce à un emplacement x, y, et que nous voulons ajouter à sa valeur x et sa valeur y pour la déplacer vers un emplacement proche, 1,0 est l'est, -1,0 est l'ouest, 0,1 est le sud, 0, -1 est le nord et ainsi de suite.
(Ici, j'ai dit que le haut à gauche est 0,0 et le bas à droite est 4,4 et j'ai montré quel mouvement chaque index des tableaux fera à partir du point central, X, à 2,2.)
La façon dont il est configuré, si vous le faites
^1
(en^
étant XOR au niveau du bit) sur l'index, vous obtenez la direction opposée - 0 et 1 sont opposés, 2 et 3 sont opposés et ainsi de suite. (Une autre façon de le configurer est d'aller dans le sens des aiguilles d'une montre en commençant par le nord - puis^4
vous obtenez la direction opposée.)Vous pouvez maintenant tester toutes les directions à partir d'un point donné en bouclant sur vos tableaux
di
etdj
, au lieu d'avoir à écrire chaque direction sur sa propre ligne (pour huit au total!) (N'oubliez pas de vérifier les limites :))diK
etdjK
formez toutes les directions des chevaliers au lieu de toutes les directions adjacentes. Ici,^1
retournera le long d'un axe,^4
donnera le saut du chevalier opposé.la source
x,y
tuple dans l'espace 2D. Pour chaque paire,di[i], dj[i]
ajoutez-lex,y
et vous serezx,y
transposé dans chaque direction une par une. Cela a-t-il du sens?Pour ceux qui trouvent l'explication de Patashu difficile à suivre, je vais essayer de clarifier.
Imaginez que vous essayez de considérer tous les mouvements possibles à partir d'un point donné sur un échiquier.
Si vous bouclez sur les tableaux di et dj, en interprétant les valeurs di comme des décalages x et les valeurs dj comme des décalages y, vous couvrez chacune des 8 directions possibles.
En supposant que x positif est est et que y positif est sud (comme dans la réponse de Patashu), vous obtenez ce qui suit;
Les tableaux diK et djK peuvent être interprétés de la même manière pour établir les mouvements possibles pour la pièce Knight. Si vous n'êtes pas familier avec les échecs, le chevalier se déplace selon un modèle en L - deux carrés dans une direction, puis un carré perpendiculaire à cela (ou vice versa).
la source
Un petit extrait de code pour vérifier le nombre de mouvements possibles dans toutes les directions, qui utilise les tableaux définis.
la source