Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 19:03   #1
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
Подмигивание Странная задача С. I курс.

Цитата:
На плоскости задано множество окружностей. Две окружности A и B назовём связанными, если они пересекаются либо существует третья окружность C заданного множества, связанная с A и B. Выбрать максимальное подмножество попарно не связанных друг с другом окружностей.
Есть какие нибудь идеи как решить?
Сначала казалось просто все... Написав
Код:
int circlesCross(circle circle1, circle circle2)
{
    float distanceX = circle1.x - circle2.x;
    float distanceY = circle1.y - circle2.y;
    float distanceBetweenCenters = sqrt(distanceX * distanceX + distanceY * distanceY);
    return (distanceBetweenCenters <= circle1.r + circle2.r);
}
я понял что не знаю что делать дальше(

Ну да
Код:
struct CIRCLE {
float x, y, r;
char crossflag;
};
и еще
Код:
CIRCLE *circle = new CIRCLE[count];
то бишь их count штуков...

Проблема собственно в выборе максимального подмножества...
Ну так что - поможите?
EniOk вне форума Ответить с цитированием
Старый 07.06.2009, 19:15   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну вот на уровне идеи:
нужно создать что-то вроде матрицы смежности.
Допустим, у нас N окружностей.
Создаем матрицу. Вначале заполняем ее прямыми связями. То есть, если i-я окружность напрямую связана с j-й, то элемент (i,j) = 1.
Так заполнили матрицу. Далее проверяем непрямые связи.
Берем i-ю окружность. Для нее просматриваем все остальные. Для текущей j-й проверяем оставшиеся. Если и i-я и j-я окружности пересекают k-ю, то, опять же, элемент (i,j) = 1.
Все остальные ячейки будут нулями.

Матрица создана. Теперь ищем первый элемент, равный нулю. Это ячейка (i1,j1). Теперь для j1 ищем такой столбец k, для которого (j1,k)=0.
Ну вот так и доходим до конца, в поисках самой длинной цепочки.
Думаю, идея должна быть ясна.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.06.2009, 19:25   #3
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Ясно но не совсем понятно почему именоо цепочка с первым не нулевым элементом который нашелся в матрице связей будет длиннее других...

Хотя наверное возможно повторить это для всех таких элементов и посмотреть где получится больше окружностей... Но это же сколько действий! Все равно спасибо, идея интересная) Хотя и хотелось бы что то по проще)
EniOk вне форума Ответить с цитированием
Старый 07.06.2009, 19:29   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от EniOk
Ясно но не совсем понятно почему именоо цепочка с первым не нулевым элементом который нашелся в матрице связей будет длиннее других...
Почему ненулевым? Наоборот. Ищем первый нулевой элемент. Т.к. это сразу дает 2 несвязанные окружности.

Вообще, навскидку, это не очень сложный вариант. И действий будет не так уж много. Возможно, понадобится рекурсивная функция для конечной части (по крайней мере, я бы делал именно через рекурсию).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.06.2009, 19:29   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Я бы создал матрицу связности окружностей, в которой элемент[x][y] == false означает, что окружности x и y не связанные.
Заполнять её можно в 2 этапа:
1) если окружности пересекаются
2) уже по данным этой матрицы легко определяем есть ли третья окружность, которая пересекает 2 окружности.
Примерно так:
Код:
цикл от (с = 0) до (с < число_окружностей)
начало
  если (матрица[c][a] и матрица[c][b]) значит
  начало
    матрица[a][b] = true;
    матрица[b][a] = true;
  конец
конец
Если моё предположение верно и я правильно понял задание, значит нужно всего-лишь найти столбец (ну или строку матрицы. как Вам больше нравится), в котором больше всего значений false.
Допустим, это будет столбец x. Тогда:
Код:
цикл от (y = 0) до (y < число окружностей)
начало
  если (матрица[x][y] == false) значит
    окружность y входит в искомое подмножество
конец
ЗЫ. Долго как я ответ писал

Так вот. Мне кажется, нет смысла в рекурсиях и мой вариант оптимальнее. Из условия задачи вытекает, что если окружность С не связана с окружностью А и не связана с окружностью Б, то и А не связана с Б. Таким образом, если найти такую окружность, которая не связана с бОльшим числом окружностей, то это и будет наибольшее подмножество несвязанных окружностей.

Последний раз редактировалось pu4koff; 07.06.2009 в 19:40.
pu4koff вне форума Ответить с цитированием
Старый 07.06.2009, 20:05   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

pu4koff, так ведь нужно найти
Цитата:
максимальное подмножество попарно не связанных друг с другом окружностей.
А вы, как я понимаю, предлагаете брать окружность с наименьшим числом связей.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.06.2009, 20:12   #7
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Хмм... А если в варианте pu4koff после этого все что имеет false в строке у этой окружности опять проверять на взаимные связи - так это рекурента)
EniOk вне форума Ответить с цитированием
Старый 07.06.2009, 20:13   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
А вы, как я понимаю, предлагаете брать окружность с наименьшим числом связей.
Я честно говоря до конца не понимаю это выражение: "максимальное подмножество попарно не связанных друг с другом окружностей".
А то под это подходит и простой поиск всех нулей в матрице. А и Б не связаны, значит добавляем в подмножество, т.к. они друг с другом попарно не связаны.

Нет. я в своём предположении был не прав. Сейчас на листочке нарисовал пару вариантов и 1 сработал, а во втором уже фигня получилась

Последний раз редактировалось pu4koff; 07.06.2009 в 20:18.
pu4koff вне форума Ответить с цитированием
Старый 07.06.2009, 20:20   #9
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Я честно говоря до конца не понимаю это выражение: "максимальное подмножество попарно не связанных друг с другом окружностей".
А то под это подходит и простой поиск всех нулей в матрице. А и Б не связаны, значит добавляем в подмножество, т.к. они друг с другом попарно не связаны.

Нет. я в своём предположении был не прав. Сейчас на листочке нарисовал пару вариантов и 1 сработал, а во втором уже фигня получилась
Ну... Такое уж условие дали...
EniOk вне форума Ответить с цитированием
Старый 07.06.2009, 20:33   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот:


Как я понял, одна из самых длинных цепочек будет 1 -> 4 -> 8, т.к. они попарно не связаны.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странная задача ARF_name Паскаль, Turbo Pascal, PascalABC.NET 1 29.04.2009 11:24
Странная загрузка Лубышев Операционные системы общие вопросы 9 17.03.2008 09:24
Не вижу ошибку...помогите. 1 курс задача на Си good_andy Помощь студентам 6 02.01.2008 10:01
Странная реакция drknn Помощь студентам 2 02.09.2007 15:51
Странная ошибка Washington БД в Delphi 2 16.03.2007 18:13