Russian Qt Forum
Ноябрь 23, 2024, 22:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: поле N x N заполненное двумя значениями  (Прочитано 6672 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Ноябрь 09, 2011, 12:32 »

Найти все левые верхние углы. Каждое дерево может быть "ограничителем" прямоугольника. Это легко отловить 2-мя проходами. Псевдокод прохода по строкам
Код
C++ (Qt)
if (row < N - 1)
if (tree(row, col) && !tree(row + 1, col) {
int left = lookLeft(row + 1, col);          // левое дерево в следующей (row + 1) строке (или -1)
int right = lookRight(row + 1, col);      // правое дерево в следующей строке (или N)
for (int i = left + 1; i < right; ++i)
 MarkHorz(row + 1, i);
}  
 
По столбцам аналогично. Найденных углов будет не так уж много

Теперь для каждого угла P есть изначальный прямоугольник (P - точка (N, N)). Находим дерево внутри него которое образует с P минимальный прямоугольник (поиск по сортированным деревьям). Получаем 2 новых возможных прямоугольника, в которых находим ближайшее к P дерево по горизонтали и вертикали соответственно.

Данные: я бы держал деревья напр так
Код:
QVector <QVector <int> > mTreesHorz, mTreeVert;
Чтобы удобно находить деревья в заданной строке/столбце (lower_bound)

Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.159 секунд. Запросов: 22.