Eu sou novo na programação competitiva e notei frequentemente que muitos dos grandes programadores têm essas quatro linhas em seus códigos (especialmente naqueles que envolvem matrizes):
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 };
O que isso realmente significa e para que é usada a técnica?
d={0,1,0,-1,0}
para isso: pares de itens parad[i], d[i+1]
me dar quatro direções cardeais.Respostas:
Esta é uma técnica para codificar todas as direções como matrizes - cada par de
di[i],dj[i]
está em uma direção diferente.Se imaginarmos que temos uma peça em um local x, y, e quisermos somar seus valores x e y para movê-la para um local próximo, 1,0 é leste, -1,0 é oeste, 0,1 é sul, 0, -1 é norte e assim por diante.
(Aqui, eu disse que o canto superior esquerdo é 0,0 e o canto inferior direito 4,4 e mostrei qual movimento cada índice das matrizes fará a partir do ponto central, X, em 2,2.)
Da forma como está configurado, se você fizer
^1
(^
sendo XOR bit a bit) no índice, obterá a direção oposta - 0 e 1 são opostos, 2 e 3 são opostos e assim por diante. (Outra forma de configurá-lo é ir no sentido horário, começando no norte - então,^4
leva você na direção oposta.)Agora você pode testar todas as direções a partir de um determinado ponto fazendo um loop sobre seus arrays
di
edj
, em vez de precisar escrever cada direção em sua própria linha (para oito no total!) (Só não se esqueça de verificar os limites :))diK
edjK
formar todas as direções dos cavaleiros em vez de todas as direções adjacentes. Aqui,^1
vai virar ao longo de um eixo,^4
vai dar o salto do cavalo oposto.fonte
x,y
tupla no espaço 2D. Para cada par de,di[i], dj[i]
adicione-ox,y
e você seráx,y
transposto em cada direção, um por um. Isso faz sentido?Para aqueles que acham a explicação de Patashu difícil de seguir, tentarei esclarecer.
Imagine que você está tentando considerar todos os movimentos possíveis a partir de um determinado ponto de um tabuleiro de xadrez.
Se você percorrer as matrizes di e dj, interpretando os valores di como deslocamentos x e os valores dj como deslocamentos y, você cobrirá cada uma das 8 direções possíveis.
Assumindo que x positivo é leste e y positivo é sul (como na resposta de Patashu), você obtém o seguinte;
As matrizes diK e djK podem ser interpretadas da mesma maneira para estabelecer os movimentos possíveis para a peça do Cavalo. Se você não estiver familiarizado com o xadrez, o Cavalo se move em um padrão L - duas casas em uma direção e, em seguida, uma casa perpendicular a ela (ou vice-versa).
fonte
Um pequeno trecho de código para verificar a quantidade de movimentos possíveis em todas as direções, que usa os arrays definidos.
fonte