Получение числовых копий объекта, касающегося друг друга на двухмерной плоскости (алгоритм Java)

1

Мне нужно написать код для метода, который вернет число объектов, которые касаются друг друга для проекта java, над которым я работаю. Это может быть довольно сложно обернуть вокруг вас, вот вот наглядный пример.

Изображение 174551

Где светло-серый квадрат - это начало, которое должно быть любым из квадратов, и любой квадрат, который окрашен, является копией одного и того же объекта (тот же код); Мне нужно найти количество квадратов в любом заданном шаблоне, если они касаются другого. Это вернет 42, если я посчитаю правильно, потому что это число цветных квадратов. У меня есть доступ к методам, которые будут проверять блоки выше, ниже и по обе стороны от блока и возвращать логическое значение, но они могут видеть только 1, 1 и 1 по две стороны. Я думаю, что это должно вызвать какую-то цепную реакцию. Где другие блоки проверяют 1 выше, ниже и по сторонам. В частности, это будет написано в java, но это скорее алгоритм/математический вопрос.

  • 0
    это хорошая проблема! Вы должны добавить логическое поле к «квадратному» объекту, который указывает, было ли оно подсчитано в текущем выполнении алгоритма. Затем проверяйте рекурсивно во всех направлениях, пока не найдете счетный квадрат или стену. Думайте об этом, почти как 4-дерево с множеством перекрестных связей.
  • 1
    См. En.wikipedia.org/wiki/Depth-first_search
Показать ещё 2 комментария
Теги:
algorithm
math
plot

1 ответ

1
Лучший ответ
Create two lists - you can call them open and closed.
Add the start square to the open list.
While the open list is not empty:
  Remove one of the objects from the open list.
  Add this object to the closed list.
  For each of the 4 addjacent squares to this object:
    If the square is not in the open or closed lists and is the type you are trying to find add this square to the open list.
The size of the closed list is your answer.

Поскольку вы, похоже, храните много ссылок на один и тот же объект на плоскости вместо разных объектов в каждом месте, проверка списков, чтобы увидеть, находится ли объект в них, не будет работать.

Одним из способов решения этой проблемы является замена списков на два булевых массива размером с ваш самолет, и вместо добавления или удаления объектов из списка переверните значение булева в том же месте, что и квадрат, обрабатываемый в true или false.

Другим способом было бы создать разные объекты для каждого расположения сетки и дать им другую переменную, чтобы определить, являются ли они типом, который вы ищете, вместо того, чтобы искать один и тот же объект.

Третий способ - добавить объект, который представляет собой позицию в плоскости, вместо добавления объекта, который вы нашли в этой позиции.

  • 0
    Очень хороший ответ Это поиск в ширину. Я предлагаю использовать HashSet или двумерный логический массив вместо списка для закрытого списка, поскольку вам нужно только проверить, обрабатывался ли он ранее.
  • 0
    Спасибо! Это отличный ответ. Я постараюсь реализовать это, если у меня возникнут проблемы, о которых я мог бы сообщить, но это выглядит очень выполнимо и эффективно!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню