“Заполнение шаблона с мозаиками” загадка

Пусть x1, y1, vx1, vy1 будут x-позицией, y-позицией, x-скоростью и y-скоростью circle1. Аналогично, у нас есть x2, y2, vx2, vy2 для circle2.

Поскольку один из кругов, скажем, circle1, не реагирует на столкновение, полезно взглянуть на столкновение с точки зрения этого большого парня (также называемого системой отсчета). В этой системе отсчета circle2 имеет скорость x vx2 - vx1 и скорость y vy2 - vy1. Положение x и y в circle2 аналогично x2 - x1 и y2 - y1.

В этой системе отсчета circle1 также не движется и может рассматриваться как статическая стена.

Затем вы можете рассматривать эту проблему аналогично проблеме движущегося circle2, сталкивающегося со стеной с вектором нормали (x2-x1 , y2-y1) и скоростью (vx2-vx1 , vy2-vy1).

Я предполагаю, что вы знаете, как решить эту проблему, поскольку вы сказали, что понимаете столкновения между кругом и формой.

Как только вы получите конечную скорость circle2, просто не забудьте вернуться к исходной перспективе, добавив vx1 к скорости x и vy1 к скорости y.

17
задан Trillian 22 September 2011 в 15:47
поделиться

3 ответа

Я полагаю, что для экземпляров из 100 ячеек динамическая программа, основанная на резьбовом разложении входного графа, может соответствовать всем требованиям.

Резьбовое разложение

В теории графов резное разложение графа является рекурсивным бинарным разбиением его вершин. Например, вот график

1--2--3
|  |
|  |
4--5

и одно из его резьбовых разложений

     {1,2,3,4,5}
     /         \
  {1,4}        {2,3,5}
  /   \        /     \
{1}   {4}  {2,5}     {3}
           /   \
         {2}   {5}.

Ширина резного разложения - это максимальное количество ребер, выходящих из одного из его разбиений. В этом случае {2,5} имеет исходящие ребра 2--1, 2--3 и 5--4, поэтому ширина равна 3. Ширина разбиения в стиле дерева kd сетки 10 × 10 равна 13.

Ширина резьбы графа является минимальной шириной разложения резьбы. Известно, что планарные графы (в частности, подграфы сеточных графов) с n вершинами имеют ширину резьбы O (√n), а константа big-O относительно мала.

Динамическая программа

При заданном входном графе n-вершин и резьбовом разложении ширины w существует O (2 w n) -время алгоритм для расчета оптимального выбора плитки. Это время работы быстро растет в w, поэтому вы должны попытаться вручную разложить некоторые входные данные, чтобы понять, какую производительность ожидать.

Алгоритм работает на дереве декомпозиции снизу вверх. Пусть X - разбиение, и пусть F - множество ребер, покидающих X. Мы составим таблицу, отображающую каждую из 2 | F | возможностей для наличия или отсутствия ребер в F в оптимальную сумму на X при указанных ограничениях (-Infinity, если решения не существует). Например, с разделом {1,4} у нас есть записи

{} -> ??
{1--2} -> ??
{4--5} -> ??
{1--2,4--5} -> ??

Для конечных разделов только с одной вершиной подмножество F полностью определяет плитку, поэтому легко заполнить количество соединений (если плитка действительна) или -Infinity в противном случае. Для других разделов, при вычислении записи таблицы, попробуйте все различные шаблоны подключения для ребер, которые идут между двумя дочерними элементами.

Например, предположим, что у нас есть части

                       |
.    .-    .-    -.    .
     |                 

Таблица для {1} равна

{} -> 0
{1--2} -> 1
{1--4} -> -Infinity
{1--2,1--4} -> 2

Таблица для {4} равна

{} -> 0
{1--4} -> 1
{4--5} -> 1
{1--4,4--5} -> -Infinity

Теперь давайте вычислим таблицу для {1,4}. Для {}, без ребра 1--4 мы имеем оценку 0 для {1} (запись {}) плюс оценку 0 для {4} (запись {}). С краем 1--4 мы имеем счет -Infinity + 1 = -Infinity (записи {1--4}).

{} -> 0

Для {1--2} баллы: 1 + 0 = 1 без 1--4 и 2 + 1 = 3 с.

{1--2} -> 3

Продолжение.

{4--5} -> 0 + 1 = 1 (> -Infinity = -Infinity + (-Infinity))
{1--2,4--5} -> 1 + 1 = 2 (> -Infinity = 2 + (-Infinity))

В конце мы можем использовать таблицы, чтобы определить оптимальное решение.

Нахождение резного разложения

Существуют сложные алгоритмы для нахождения хороших резных разложений, но они могут вам не понадобиться. Попробуйте простую схему разбиения двоичного пространства.

6
ответ дан 30 November 2019 в 14:28
поделиться

В качестве основы посмотрите на более ранний ответ, который я дал по поводу поиска. Программы поиска с восхождением на холм - это инструмент, который должен иметь в своем арсенале каждый программист, поскольку они работают намного лучше, чем простые решатели, работающие методом грубой силы.

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

4
ответ дан 30 November 2019 в 14:28
поделиться

Думаю, у меня есть идея получше. Я не проверял ее, но я уверен, что она будет быстрее, чем чисто силовое решение для больших зон.

Во-первых, создайте пустое множество ("множество" - это коллекция, содержащая только уникальные объекты) узлов. Эта коллекция будет использоваться для определения того, какие тайлы имеют нарушенные связи, которые необходимо исправить.

Заполните структуры данных для представления доски имеющимися фигурами, используя те, которые вы считаете наиболее подходящими, исходя из ваших личных критериев без учета правильности решения. Это почти наверняка приведет вас к недопустимому состоянию, но пока все в порядке. Пройдитесь по доске и найдите все плитки, у которых есть соединения, ведущие в никуда. Добавьте их в набор сломанных плиток.

Теперь пройдитесь итерацией по этому набору. Измените плитки, к которым оно относится, уменьшив количество их соединений (иначе вы можете попасть в бесконечный цикл) так, чтобы у них не было разорванных соединений, с учетом имеющихся на данный момент фигур. Проверьте их соседей снова, и если вы разорвали связи с другими плитками, добавьте их в набор разорванных.

Как только набор разорванных соединений станет пустым, у вас должен получиться красивый узор. Заметим, однако, что у этого метода есть важная оговорка: он может иметь тенденцию к чрезмерному упрощению узоров, поскольку на этапе "исправления" всегда будет предприниматься попытка уменьшить количество соединений. Возможно, вам повезет, и вы получите интересные узоры, так как на это может сильно повлиять первая деталь, которую вы положите на каждую плитку.

2
ответ дан 30 November 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: