Блог пользователя al__gol

Автор al__gol, 12 лет назад, По-русски

Имеется некоторое число прямоугольников(спрайтов) c размерами Ni x Mi (Ni,Mi — целые числа). Каждый прямоугольник имеет различные размеры. Необходимо расположить их на произвольном(не обязательно минимальном) количестве квадратов(атласов) размером 2^Kx2^K (К — целое число ). Также необходимо минимизировать свободное пространство, образующееся при укладке. Спрайт нельзя крутить (это нужно для последующего извлечения спрайта из атласа). Ссылки на задачу нету — необходимо в промышленных целях =) Интересуют ваши идеи, мысли..

  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 5   Проголосовать: нравится +1 Проголосовать: не нравится

Дейкстрой.дп по DAG(Direct Acyclic Graph)
у нас есть n одинаковых прямоугольиков размера H на W. в один квадрат со стороной K мы их кладем один за другим слева направо сверху вниз. легко за O(1) сказать сколько прямоугольников влезет в квадрат с фиксированной стороной — (K div H) * (K div W). граф содержит вершины (n, k) — сколько у нас есть прямоугольников и текущий размер квадрата. переходы по графу это либо уменьшение размера квадрата и переход в вершину (n, k — 1) или запихивание максимального числа прямоугольников в квадрат данного размера и переход к (n — max_k, k) max_k — сколько влезло. стоимость второго перехода это размер свободного места, которое осталось в квадрате.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

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

    • »
      »
      »
      12 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится +3 Проголосовать: не нравится

      Это уже задача "раскройки", задача на оптимальное размещение. по моему её решают перебороподобными алгоритмами с отсечениями. В вашем случае наверное проще задействовать человека. Написать что-то вроде тетриса, где человек сможет мышкой таскать прямоугольники, и пусть пооптимизирует немного, убирая явные зазоры. не думаю что профит от офигенного размещения превосходит затраты на разработку офигенной программы, которая его достигает.