Вам не обязательно сравнивать массивы. Если у вас нет огромного количества шагов или полей, самый простой подход состоит в том, чтобы моделировать каждый шаг, играя в направлениях. Кстати, какой символ обозначает вниз?
Initial state
[>][ ][<]
[ ][^][ ]
[ ][<][ ]
Step +1
[ ][X][ ]
[ ][ ][ ]
[<][ ][ ]
Step +2
[ ][X][ ]
[ ][ ][ ]
[L][ ][ ]
и так далее. Вы должны быть осторожны, чтобы не перемещать одну и ту же плоскость за один шаг. Чтобы избежать этого и сделать вещи относительно простыми, вы можете создать структуру для хранения состояния самолета и массив для хранения позиций для проверки столкновений (это просто оптимизация).
Я пойду за псевдокодом.
Ваш класс класса может содержать:
originalX;
originalY;
currentX;
currentY;
state # on the field, left, collided
stepNoLeft;
stepNoCollided;
ListcollidedWith - optional
поместить самолеты в список, который будет использоваться в качестве очереди.
Создайте двумерный массив для хранения текущих позиций (просто чтобы оглянуться назад на самолет, с которым вы столкнулись). Если поле действительно разреженное (тысячи ячеек и всего несколько самолетов, вы можете рассмотреть другую структуру. Вероятно, это карта списков или мультикарта, в этом случае единственными массивами, которые у вас будут, будет список самолетов, и с кем они столкнулись. Таким образом, поле может быть мультикартой (картой списков) с ключами, представляющими собой позицию х / у. Давайте использовать мультикарту, так как это будет более общим.
очистить карту поля (для следующего шага)
переберите список самолетов и поместите самолеты в «поле» / на карте. Для первого шага у вас не должно быть координатных столкновений.
Если самолет находится в столкновении, вероятно, он не должен двигаться или улетать. Вы можете пропустить равнины, которые уже улетели (они не меняют направления, поэтому после того, как они покинули поля, они в безопасности. Карта все еще может отслеживать их, но мы не обязаны)
Обратите внимание, что допустим следующий случай: плоскости следуют друг за другом в одном файле:
step 0 [ ][<][<][ ]
step 1 [<][<][ ][ ]
Обновите текущий X, Y и поместите его в мультикарту или, если он выходит за пределы поля, пометьте его как вне поля. (в этот момент вы можете проверить занятость целевой ячейки, но можете дождаться конца шага)
В конце шага переберите карту и отметьте ячейки несколькими самолетами для столкновения.
промыть и повторить
пример:
For the Initial state
[>][ ][<]
[ ][^][ ]
[ ][<][ ]
это будет выглядеть так:
tuple: (x,y,direction,id)
step 0: airplanes( (0,0,'>', 'A') , (0,2,'<', 'B') , (1,1,'^', 'C') ,(2,1,'<', 'D')
step 1: airplanes( (0,1,'>', 'A') , (0,1,'<', 'B') , (0,1,'^', 'C') ,(2,0,'<', 'D')
map step1:
key: 0-1 : A,B,C – collided at step1
key:2-0: D
шаг 2: самолеты ((0,1, '>', 'A'), (0,1, '<', 'B'), (0,1, '^', 'C'), (2, -1, '<', 'D') </p>
airplanse A,B,C don't move (let's assume that once there was a collision they don't move)
airplane D – has left the field
map step1:
key: 0-1 : A,B,C – collided at step1
D is not in the map
Поскольку в python есть хорошие встроенные списки и карты, вам не нужна никакая библиотека.