Логика поиска по хеш-таблицам может вдохновлять.
Чтобы напомнить нам о хеш-таблице:
При поиске n
в хеш-таблице
- сначала мы смотрим на
h(n)
, где h
— это хэш-функция.
- Сообщите о рекорде, если он попадет, перейдите к h(n)+1, если он промахнется.
- Сообщите о рекорде, если он попадет, перейдите к h(n)-1, если он промахнется.
- Сообщите о рекорде, если он попадет, перейдите к h(n)+2, если он промахнется.
- Сообщите о рекорде, если он попадет, перейдите к h(n)-2, если он промахнется.
- Сообщите о рекорде, если он попадет, перейдите к h(n)+4, если он промахнется.
- Сообщите о рекорде, если он попадет, перейдите к h(n)-4, если он промахнется.
- ...
Мы устанавливаем размер шага для чисел в последовательности 2^i и их отрицательных значений (0,1,-1,2,-2,4,-4,8,-8,16,...)
Теперь в вашем сценарии:
- сначала мы смотрим на
t
, где t
— это целевое местоположение.
- Сообщите о местоположении, если оно свободно, переместитесь в [t.x,t.y+1], если нет.
- Сообщите о местоположении, если оно свободно, перейдите в [t.x, t.y-1], если нет.
- ...
- Сообщите о местоположении, если оно свободно, перейдите в [t.x-1,t.y-1], если нет.
- Сообщите о местоположении, если оно свободно, перейдите в [t.x,t.y+2], если нет.
- ...
- Сообщите о местоположении, если оно свободно, переместитесь в [t.x,t.y+4], если нет.
- ...
Теперь, как мы узнаем, свободна ли локация или нет? Вы можете создать настоящую хэш-таблицу для хранения в ней позиций всех объектов. Теперь, когда вам нужно проверить свободное место вокруг [x,y], чтобы поставить камень, вам придется искать h(x,y)
в хеш-таблице.
Если вам нужно разместить более крупный объект, например, круглый фонтан 3x3, в точке [x, y], вам также нужно будет проверить эти записи: h(x+1,y), h(x-1,y), h(x,y+1), h(x,y-1)
. Поскольку это круглый объект, вы можете аппроксимировать область для упрощения и, таким образом, удалить четыре относительных местоположения, таких как h(x+1,y+1), h(x+1,y-1), h(x-1,y+1), h(x-1,y-1)
, из вашего поиска.
После этого вы должны добавить все эти позиции в хеш-таблицу, чтобы потом было легче найти занятые позиции. например добавление объекта 3x3 требует добавления 9 записей в хеш-таблицу.
Обратите внимание, что хеш-функция должна отражать двухмерный (или трехмерный) мир. например h(x,y) = x*N + y
, где N
— максимальный размер мира по оси Y.
person
Bizhan
schedule
22.03.2018