Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Алгоритм] Вычисление прямоугольников. Типа говоломка :) 
V
    Опции темы
Ak47black
  Дата 13.7.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Пишу в этом разделе так как моя проблема чемто напоминает головоломку.  smile 

Вообщем может есть люди кто любит чтото такое решать или просто могут помочь.  smile 

Скока не пробовал решить, ну не получается ни как, невсё как надо высчитывается, какието теряются.
Попробую описать проблему как можно чётче.

Значит есть файл размером (Высота разрешения экрана)*(Длинна разрешения экрана) байт.
В этом файле хранится так мной называемая маска изменений, эта маска представляет из себя массив байт, каждый байт отвечает за то - было-ли изменение пикселя.
FFh соотвествует изминённому байту, а 00h не изминённому.
Чтобы определить был ли пиксель который находиться по (X,Y) изминён я использую следущую формулу - 
Код

(указатель на начало файла) + (Длинна разрешения экрана)*Y + X

Нус попробую нарисовать что я тут говорю визуально (содержимое файла динамически меняется)

user posted image

Задача 
сделать функцию которая высчитывала-бы из этой 'маски изменений' прямоугольники изменений.
Тоесть есть надо получить координаты прямоугольников внутри которых произошли изменения.

Требования 
  • Алгоритм вычисления должен работать с максимальной скоростью, тоесть не использовать слишком часто такие операции как например нахождения остатка от деления.
  • На выходе получать как можно меньше прямоугольников.
  • Ну и естественно что-бы ничего не терялось smile, если у меня этого небыло то не спрашивал-бы.
Надеюсь ктонибудь подскажет или скажет гениальную идею.  smile 
Код можете выкладывать на любом языке программирования, главное чтобы он отражал мысль решения этой проблемы.
Если что-то не чётко написал то извиняюсь, напишите что имеено поясню поконкретней.

Это сообщение отредактировал(а) Ak47black - 13.7.2007, 22:26
PM MAIL   Вверх
JackYF
Дата 13.7.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 2
Всего: 162



Одна из олимпиадных задач. Нахождение максимальных подпрямоугольников.

Решается методом динамического программирования. Это точно.

Дальше мои собственные рассуждения... не буду судить эффективность, но идея такая:
Есть функция, которая принимает как параметр прямоугольник. Она рекурсивна, будет вызывать сама себя.

Так вот. Функция при получении прямоугольника первым делом ищет неизмененный пиксель внутри. Каким методом - точно не знаю. Вообще говоря - лучше спиральным методом, начиная из середины.
Если такового нету - весь прямоугольник на выход.

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ak47black
Дата 13.7.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Не тут не с олимпиады.  smile 
Тут немного другая задача.
Надо пройтись по всем байтам и составить массив прямоугольников.
Я пробовал уже в два этапа 
1. Вычисление прямоугольников.
2. Объединение похожих
Но теряю некоторые smile и очень трудно засечь утечку.

Добавлено через 7 минут и 14 секунд
А нигде про это не писалось, я имею ввиду может гдето это уже описовась.
Как-бы мне тут лучше подойти.

Это сообщение отредактировал(а) Ak47black - 13.7.2007, 23:32
PM MAIL   Вверх
JackYF
Дата 14.7.2007, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 2
Всего: 162



Цитата(Ak47black @  13.7.2007,  23:29 Найти цитируемый пост)
Не тут не с олимпиады.  smile 

ну то я к примеру.

Цитата(Ak47black @  13.7.2007,  23:29 Найти цитируемый пост)
Тут немного другая задача.

чем отличается?

надо составить массив прямоугольников. Верно? Мой алгоритм его и составляет.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ak47black
Дата 14.7.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



JackYF, ну что я неособо могу представить как эти выполнить.
А ты откуданибудь взял может?
PM MAIL   Вверх
JackYF
Дата 14.7.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 2
Всего: 162



Цитата(Ak47black @  14.7.2007,  17:58 Найти цитируемый пост)
А ты откуданибудь взял может? 

что взял?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ak47black
Дата 14.7.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



JackYF, 
Я тут понял что я мой алгоритм нормально работает, проблема было не изза него.
Сорри что поднял эту тему.

Это сообщение отредактировал(а) Ak47black - 14.7.2007, 20:21
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.