| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Многомерные массивы |
| Автор: Снежанна 9.12.2008, 21:00 |
| Здравствуйте, Уважаемые программисты! Я открыла для себя удивительный язык С++ совсем недавно. Да некоторых пор проблем не возникало (язык легко дается). Но вот задали задачку, к которой я не знаю, с какой стороны подобраться... Звучит она так: Найти такую точку заданного на плоскости множества точек, сумма расстояний от которой до остальных минимальна! Единственное, что я точно знаю, без многомерных массивов здесь не обойтись. Очень надеюсь на вашу помощь в решении этого вопроса! Заранее благодарна! |
| Автор: kosmonaFFFt 9.12.2008, 21:20 |
| Можно и без многомерных, обычного вектора (который std::vector) хватит. |
| Автор: bsa 10.12.2008, 16:36 |
| В принципе, действительно нет необходимости в многомерном массиве... Достаточно 2 одномерных: 1. массив координат точек (на N элементов) 2. массив сумм расстояний для каждой точки (на N элементов) Что делать - идешь по первому массиву и считаешь сумму расстояний для i-ой точки и записываешь в i-ый элемент второго массива. Затем находишь во втором массиве минимальный элемент - его индекс позволит узнать точку, которой он соответствует. |
| Автор: Garcian 10.12.2008, 20:10 |
| А, мы такое делали.. Ток не вышло ничего) |
| Автор: Снежанна 10.12.2008, 20:14 |
| Впринципе понятно... Только с геометрией не все хорошо, |
| Автор: Снежанна 10.12.2008, 20:52 |
| Может и бред... раздел для новичков) |
| Автор: GoldFinch 10.12.2008, 20:58 |
| Снежанна, какой пример? как среднее арифметическое считать? я как-то забыл как это делается, потому не могу написать, и учебника за 5й класс под рукой нету =\ |
| Автор: Снежанна 10.12.2008, 21:13 |
| Мне понять как это в программе осущетвить. А среднее арифмитическое могу напомнить |
| Автор: J0ker 10.12.2008, 22:45 | ||
а может он не просто так что-то мне это видится более чем не очевидно Добавлено через 8 минут и 28 секунд или вы имели ввиду средневзвешенное? |
| Автор: bsa 11.12.2008, 12:31 | ||||||
расстояние между двумя точками считается, как квадратный корень из суммы квадратов разностей координат:
Добавлено через 2 минуты и 31 секунду
|
| Автор: Dmi3ev 11.12.2008, 13:09 | ||||
| когда-то писал, может пригодится: тут класс точки и класс прямой, прямая может возвращать расстояние между точками, которыми задана, tg угла наклона и смещение, те короче y=kx+b, она может вернуть k, b, а также расстояние между точками, которыми задана... <myline.h>
а это <mypoint.h>
|
| Автор: GoldFinch 11.12.2008, 13:57 |
| Признаю я был не прав. Среднее арифметическое там не подходит хотя бы потому что оно выдает точку не обязательно принадлежащую к множеству заданных точек. Однако я заметил что C++ убило мозг участников форума, т.к. никто так и не попытался решить задачу математически. При беглом анализе, очевидно что для вырожденного случая с 2я точками обе точки являются решениями, также точки могут совпадать друг с другом. Для вырожденного случая когда все точки находятся на одной прямой, если число точек нечетно, решением является "средняя" точка, если четно - две "средние" точки. Я не проверял, но с большой долей вероятности "средней" точкой является точка ближайшая к центру масс, т.е. к среднему арифметическому координат точек. |
| Автор: Dmi3ev 11.12.2008, 14:03 | ||
Наоборот. Мозг ищет более рациональное решение. Мне, допустим, легче сначала решить эту задачу программно в лоб, а потом, если время позволит произвести анализ решения. |
| Автор: GoldFinch 11.12.2008, 14:19 |
Модератор: Сообщение скрыто. |
| Автор: J0ker 11.12.2008, 18:36 | ||
среднеарифметическое и центр масс необязательно совпадают, потому, что это разные вещи |
| Автор: GoldFinch 11.12.2008, 18:57 |
| J0ker, при одинаковых массах совпадают. Я привел такую формулировку для удобного перехода от более очевидного физического подхода к формулировке задачи к менее очевидному математическому. upd: убрал очипятку) поспешишь.... |
| Автор: Снежанна 11.12.2008, 20:24 |
| Спасибо, bsa, Dmi3ev (хотя я не совсем представляю, как воспользоваться <mypoint.h>). Также, мне необхадимо указать все некорректные ситуации. Что это значит? |
| Автор: J0ker 11.12.2008, 20:27 |
при одинаковых массах точек тогда да Добавлено через 1 минуту и 55 секунд но это интуитивное решение... надо-бы как-то подкрепить док-вом... впрочем я думаю оно легко выводится и так оно и будет |
| Автор: bsa 11.12.2008, 22:06 | ||
Это значит, что ты должна указать все ситуации, когда твоя программа будет работать некорректно. Например, если есть более одной искомой точки (частные варианты: все точки в одном месте, всего 2 точки, все точки в вершинах правильных N-угольков), или всего одна точка в массиве. |
| Автор: Dmi3ev 11.12.2008, 22:54 | ||||
Столько споров, давайте посмотрим, я набросал решение (оно не идеально, но...):
Центр масс имеет место быть ))) По-моему мнению. А вото mypoint.h
Добавлено через 7 минут и 27 секунд хотя алгоритм нахождения центра масс фигуры, а потом сравнивание этого центра с каждой точкой (какая ближе)... хз, по-моему, так проще, хотя, может, прав не я... |
| Автор: Dmi3ev 11.12.2008, 23:48 | ||
| Вообщем, как говорится, ЧТД Решил двумя способами, 1-сумма расстояний, 2-расстояние до центра масс, ответы совпадают )))
|
| Автор: J0ker 12.12.2008, 01:09 | ||
это не может считаться док-вом, т.к. верно на ограниченом множестве проверенным с помощью вашей программы например |
| Автор: Dmi3ev 12.12.2008, 01:50 |
| J0ker, Вы не юрист? или математик? просто эти люди любят к словам докапываться. Хорошо, не чтд. Скажу так, данная программа выдает из 10(0) раз одинаковые решения обоими способами, я задавал множество и побольше размером, точно все также... Вобщем, на доказательство не претендую, но ... Мне кажется все стало ясно... Себе я доказал, что хотел... Решил поделиться с другими своими изысканиями... Но другие слишком умные... Можно еще не только целые координаты задавать(у меня они только целые в программе)... Я согласен с тем, что это доказательство не может считаться неопровержимым. Да я и не в том смысле говорил чтд. Я имел в виду, что догадки GoldFinch да и ваши тоже оказались подкреплены и программой... |
| Автор: J0ker 12.12.2008, 02:59 |
| я бы на месте препода точно-бы докопался Добавлено через 1 минуту и 12 секунд ну звиняйте для меня чтд означает "что и требовалось доказать" |
| Автор: Dmi3ev 12.12.2008, 04:10 | ||
я ж говорю, шибко умный ВЫ |
| Автор: GoldFinch 12.12.2008, 19:01 | ||
чето незаметно |
| Автор: Kallikanzarid 12.12.2008, 19:13 |
| Добавлю, что лучше в таком случае считывать x- и y-координаты в бинарные деревья, чтобы потом быстро найти точку, ближе всего лежащую к среднему арифметическому. |
| Автор: Dmi3ev 12.12.2008, 19:55 | ||
GoldFinch! Докажи обратное))) Если бы ты сидел со мной рядом и я бы тебе сказал, что точки принадлежащие одной прямой не лежат в одной плоскости, или, что шар квадратный, ты вряд ли бы стал спорить))) А кричать о том, что ты умный, не значит быть умным))) Скорее это значит обратное))) Что конкретно в программной реализации тебя не устраивает??? По делу говори, а не посты зарабатывай...))) заметно, незаметно... Удачи... |
| Автор: Ln78 12.12.2008, 20:26 | ||||
Dmi3ev, это инженерное доказательство, но не математическое. Если математическое, то примерно так: ![]() В производной здесь опечатка, понятно, что если дифференцируем по x, то игрековой части не будет. Лень перерисовывать. |
| Автор: Dmi3ev 12.12.2008, 21:17 |
| Ln78, да я не претендовал на доказательство математическое. Просто пока разводились базары, решил быстренько написать программку, которая собственно и являлась целью вопроса автора. Но когда я её написал, опять начались базары, только уже по поводу того, что я не совсем правильно выразился, сказал чтд, ***ны в рот. Но я так сказал, всего лишь потому, что решил двумя способами, они давали, как предполагалось одинаковое решение. И тут вдруг опять споры... Ненавижу эти споры... Всё, доказывайте, спорьте, делайте, что хотите, для меня все ясно с самого начала... Всем удачи... |
| Автор: GoldFinch 12.12.2008, 21:33 |
это ты про себя так сказал? |
| Автор: J0ker 13.12.2008, 02:53 | ||
вот именно таким образом рождаются самые заковыристые заблуждения просто надо понять, что не всегда то, что очевидно - верно |
| Автор: Снежанна 14.12.2008, 15:58 |
| а что за функция рандом? Компилятор не распознает. |
| Автор: J0ker 14.12.2008, 22:55 | ||||
|
| Автор: Снежанна 23.12.2008, 22:17 | ||||
Вообщем выдает 2 ошибки...
В чем проблема? |
| Автор: mes 23.12.2008, 23:12 |
for (int i=1; i<n; i++) и в самом конце текста добавьте пустую строку. |
| Автор: Dmi3ev 23.12.2008, 23:25 |
| mes, спасибо, а то она в личку пишет, почему не работает??? а я не знаю, у меня на компе рабочая версия этой проги, я же не знаю, что она видоизменяет после моего написания Снежанна, то, что после // можно и убрать, я просто тебе отослал с ними, потому, что быстро исправлял... а ты могла бы и навести красоту, ты же девушка... |
| Автор: bsa 24.12.2008, 00:23 | ||||
Снежанна, вот это:
|
| Автор: Снежанна 24.12.2008, 20:25 |
| уж извините, что в универе на компах 90х приходится с Борландом работать |
| Автор: Снежанна 24.12.2008, 21:36 |
| Да и еще, до этого я составляла только входные и выходные файлы. А как сделать файл протокола, который содержал бы в себе оба этих файла, так и еще показывал все промежуточные рассчеты и неккоректные ситуации (с которыми, собственно говоря, тоже не успеваю разобраться), покажите, пожалуйста |