Я новичок в конкурентном программировании и часто замечал, что многие великие программисты имеют эти четыре строчки в своем коде (особенно в тех, которые связаны с массивами):
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 };
Что это на самом деле означает и для чего используется техника?
d={0,1,0,-1,0}
для этого: пары предметовd[i], d[i+1]
дают мне четыре основных направления.Ответы:
Это метод кодирования всех направлений в виде массивов - каждой пары
di[i],dj[i]
представляет собой другое направление.Если мы представим, что у нас есть кусок в точке x, y, и мы хотим добавить к его x и значение y, чтобы переместить его в соседнее место, 1,0 - восток, -1,0 - запад, 0,1 юг, 0, -1 север и так далее.
(Здесь я сказал, что верхний левый угол равен 0,0, а нижний правый угол равен 4,4, и показано, какое перемещение будет совершать каждый индекс массивов из центральной точки X на уровне 2,2.)
Как он настроен, если вы выполняете
^1
(^
выполняя побитовое XOR) с индексом, вы получаете противоположное направление - 0 и 1 - противоположности, 2 и 3 - противоположности и так далее. (Другой способ настроить его - повернуть по часовой стрелке, начиная с севера, затем^4
получить противоположное направление.)Теперь вы можете проверить все направления из заданной точки, перебрав ваши
di
иdj
массивы , вместо того, чтобы записывать каждое направление в отдельной строке (всего восемь!) (Только не забудьте выполнить проверку границ :))diK
иdjK
формируют все направления рыцарей вместо всех смежных направлений. Здесь^1
перевернется по одной оси,^4
даст противоположный прыжок коня.источник
x,y
кортежем в 2D-пространстве. Для каждой парыdi[i], dj[i]
добавьте его,x,y
и вы будетеx,y
транспонированы в каждом направлении один за другим. Имеет ли это смысл?Для тех, кто считает объяснение Паташу трудным для понимания, я попытаюсь уточнить.
Представьте, что вы пытаетесь рассмотреть все возможные ходы из данной точки на шахматной доске.
Если вы в цикле перебираете массивы di и dj, интерпретируя значения di как смещения по x, а значения dj как смещения по y, вы охватываете каждое из 8 возможных направлений.
Предполагая, что положительный x - восток, а положительный y - юг (как в ответе Паташу), вы получите следующее:
Массивы diK и djK можно интерпретировать одинаково для определения возможных ходов коня. Если вы не знакомы с шахматами, конь движется по L-образной схеме - два квадрата в одном направлении, а затем один квадрат под прямым углом к нему (или наоборот).
источник
Небольшой фрагмент кода для проверки количества возможных перемещений во всех направлениях, в котором используются определенные массивы.
источник