Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the significance of initializing direction arrays below with given values when developing chess program?

Tags:

c++

c

chess

I am new to competitive programming, and I noticed frequently, many of the great coders have these four lines in their code (particularly in those involving arrays):

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 }; 

What does this really signify and what is technique used for?

like image 909
ejjyrex Avatar asked May 03 '13 00:05

ejjyrex


1 Answers

This is a technique to encode all directions as arrays - every pair of di[i],dj[i] is a different direction.

If we imagine we have a piece at a location x,y, and we want to add onto its x and its y value to move it to a nearby location, 1,0 is east, -1,0 is west, 0,1 is south, 0,-1 is north and so on.

(Here I have said top left is 0,0 and bottom right is 4,4 and shown what move each index of the arrays will make from the central point, X, at 2,2.)

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

The way it is set up, if you do ^1 (^ being bitwise XOR) on the index you get the opposite direction - 0 and 1 are opposites, 2 and 3 are opposites and so on. (Another way to set it up is to go clockwise starting at north - then ^4 gets you the opposite direction.)

Now you can test all directions from a given point by looping over your di and dj arrays, instead of needing to write out each direction on its own line (for eight in total!) (Just don't forget to do bounds checking :) )

diK and djK form all knights directions instead of all adjacent directions. Here, ^1 will flip along one axis, ^4 will give the opposite knight leap.

.7.6. 0...5 ..K.. 1...4 .2.3. 
like image 98
Patashu Avatar answered Oct 21 '22 13:10

Patashu