![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
In progress...
Форумчанин
Регистрация: 25.09.2011
Сообщений: 161
|
![]()
Задание:
На плоскости даны N точек. Никакие две точки не совпадают, никакие три не лежат на одной прямой. Найдите треугольник с вершинами в этих точках, имеющий наименьший возможный периметр. Все это должно браться из файла, такого вида: Input 5 - Кол-во точек 0 0 -т1 1.3 0 -т2 -2 0.1 -т3 1 0 -т4 10 10 - т5 В выходной файл выведите три числа – номера точек, которые должны быть вершинами треугольника, чтобы его периметр был минимален. Если решений несколько выведите любое из них. Запись ответа в файл, такого вида: Output 1 2 4 С этим проблем нет. Интересуют несколько вопросов. 1.Как в паскале работать с переменной типа "точка", ведь она имеет два значения, допустим A(10,9); Запись в паскале будет вида A(x1,y1) ? Вводим х1 у1 и потом присваиваем переменной А ? 2.И на счет алгоритма. Как реализовать поиск этих трех точек при котором периметр будет минимальным. Есть вариант: Периметр - сумма всех сторон. То есть периметр будет минимальным при минимальных длинах 3х прямых. Нужно только найти 3 самых коротких прямых, которые образуют треугольник. Формула нахождения длинны отрезка по двум точкам: R:=sqrt ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) |
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]() Цитата:
Соображение раз: если внутри треугольника есть точка, он не оптимален. Соображение два: оптимальный треугольник с большей вероятностью включает короткие отрезки. Соображение три: если сместить начало координат в некоторую точку, то из треугольников с вершиной в этой точке оптимальный можно найти, вначале беря точки вблизи. Соображение четыре: с учётом неравенства max(|x|,|y|)<=sqrt(x*x+y*y)<=(|x|+| y|), можно отбрасывать варианты отрезков, заведомо превышающих по длине периметр оптимального треугольника. Последний раз редактировалось Abstraction; 01.11.2011 в 01:25. |
|
![]() |
![]() |
![]() |
#3 |
In progress...
Форумчанин
Регистрация: 25.09.2011
Сообщений: 161
|
![]()
Последнее не совсем понял. Да и о смещении начала координат тоже не вижу смысла.
Как вариант сделать через два массива, один типа инт со значениями второй типа чар,названия точек. Алгоритм сравнения длинны каждой прямой с каждой другой, ну и вывод. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]()
"Каждый с каждым" - метод дохлый, требует O(N^3) операций.
Но если на некоторый момент мы уже нашли треугольник с периметром P, оптимальный треугольник заведомо не содержит рёбер длины от P/2. Как черновая идея: 1) Выбрать следующую (вначале - первую) точку k как первую точку треугольника. Если точки кончились, перейти к 9). 2) Остальные точки отсортировать по максимуму модулей координатных разностей d во вспомогательный массив. 3) Взять i - следующую (вначале - первую) точку этого массива. Если точки кончились, перейти к 1). 4) Если уже найден треугольник с периметром 2d[i] и менее, перейти к 1). 5) Взять j - следующую (вначале - следующую непосредственно за i) точку вспомогательного массива. Если точки кончились, перейти к 3). 6) Если уже найден треугольник с периметром d[i]+d[j] и менее, перейти к 3). 7) Найти периметр p' треугольника (i,j,k); если у уже найденного треугольника периметр больше p' либо треугольников ещё не найдено, сделать (i,j,k) найденным треугольником. 8) Перейти к 5). 9) Найденный треугольник есть оптимальный треугольник. |
![]() |
![]() |
![]() |
#5 |
In progress...
Форумчанин
Регистрация: 25.09.2011
Сообщений: 161
|
![]()
Спасибо, попробую реализовать.
|
![]() |
![]() |
![]() |
#6 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
Цитата:
это, конечно, тоже не фонтан в плане производительности, но при N=100, получается, например, 161700 вариантов, что почти на порядок меньше, чем N^3 это я к чему. При небольших N вполне допустимо решение с прямым перебором вершин. (при этом достаточно хранить номера точек и найденный минимальный периметр). Единственная оптимизация, если расстояние до очередной точки больше MinP/2 - то точку можно отбрасывать. Это немного сузит количество вариантов. и ещё добавлю. не уверен, что это оптимальное в плане производительности решение (точнее, это точно НЕ ОПТИМАЛЬНОЕ по производительности решение, это буквально "ТУПО В ЛОБ"!) но! я бы брал 1-ю точку и искал две БЛИЖАЙШИЕ к ней точки.(перебор в цикле N-1 значений) считал сумму расстояний как периметр. брал вторую точку и перебор в цикле N-1 значений. и так N раз (для каждой точки). минимальное значение периметра найдено! Последний раз редактировалось Serge_Bliznykov; 02.11.2011 в 14:06. |
||
![]() |
![]() |
![]() |
#7 | ||
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#8 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
Abstraction
мда... разгромили Вы мои выводы в пух и прах! Цитата:
Цитата:
я написал программу, перебирает все возможные сочетания, ищет минимальное значение. вот, может пригодится кому... Код:
|
||
![]() |
![]() |
![]() |
#9 |
In progress...
Форумчанин
Регистрация: 25.09.2011
Сообщений: 161
|
![]()
Спасибо огромное. Почти доделал по алгоритму Abstraction, позже выложу "свой" вариант.
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как обойти "преобразование типа из "string" в "float" невозможно" | lexluter1988 | Помощь студентам | 1 | 07.08.2010 12:23 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |
Метод перебора для нахождения решения "Судоку" | ДЖО | Помощь студентам | 23 | 04.06.2008 22:29 |
"Транспортная задача", "Поиск решения" | Perroman | Microsoft Office Excel | 3 | 12.12.2007 17:12 |