Soy nuevo en la programación competitiva, y noté con frecuencia que muchos de los grandes codificadores tienen estas cuatro líneas en su código (particularmente en las que involucran matrices):
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é significa esto realmente y para qué se utiliza la técnica?
d={0,1,0,-1,0}
para esto: pares de elementos parad[i], d[i+1]
darme cuatro direcciones cardinales.Respuestas:
Esta es una técnica para codificar todas las direcciones como matrices: cada par
di[i],dj[i]
es una dirección diferente.Si imaginamos que tenemos una pieza en una ubicación x, y, y queremos agregar a su xy su valor y para moverla a una ubicación cercana, 1,0 es este, -1,0 es oeste, 0,1 es el sur, 0, -1 es el norte y así sucesivamente.
(Aquí he dicho que la parte superior izquierda es 0,0 y la parte inferior derecha es 4,4 y se muestra qué movimiento hará cada índice de las matrices desde el punto central, X, en 2,2).
De la forma en que está configurado, si lo hace
^1
(^
siendo XOR bit a bit) en el índice, obtiene la dirección opuesta: 0 y 1 son opuestos, 2 y 3 son opuestos, etc. (Otra forma de configurarlo es ir en el sentido de las agujas del reloj comenzando en el norte, luego^4
te lleva en la dirección opuesta).Ahora puede probar todas las direcciones desde un punto dado haciendo un bucle sobre sus matrices
di
ydj
, en lugar de tener que escribir cada dirección en su propia línea (¡para ocho en total!) (¡No olvide verificar los límites :))diK
ydjK
formar todas las direcciones de los caballeros en lugar de todas las direcciones adyacentes. Aquí,^1
girará a lo largo de un eje,^4
dará el salto de caballo opuesto.fuente
x,y
tupla en un espacio 2D. Para cada par,di[i], dj[i]
agréguelox,y
y sex,y
transpondrá en cada dirección una por una. ¿Tiene sentido?Para aquellos que encuentran la explicación de Patashu difícil de seguir, intentaré aclarar.
Imagina que estás tratando de considerar todos los movimientos posibles desde un punto dado en un tablero de ajedrez.
Si recorre las matrices di y dj, interpretando los valores di como compensaciones x y los valores dj como compensaciones y, cubrirá cada una de las 8 direcciones posibles.
Suponiendo que x positivo es este y y positivo es sur (como en la respuesta de Patashu), obtienes lo siguiente;
Las matrices diK y djK se pueden interpretar de la misma manera para establecer los posibles movimientos de la pieza de Caballero. Si no está familiarizado con el ajedrez, el Caballo se mueve en un patrón de L: dos cuadrados en una dirección y luego un cuadrado en ángulo recto con ese (o viceversa).
fuente
Un pequeño fragmento de código para comprobar la cantidad de movimientos posibles en todas las direcciones, que utiliza las matrices definidas.
fuente